[解決済み】限られた数のコマンドを並列に処理するBashスクリプト
質問
次のようなbashスクリプトがあります。
#!/bin/bash
wget LINK1 >/dev/null 2>&1
wget LINK2 >/dev/null 2>&1
wget LINK3 >/dev/null 2>&1
wget LINK4 >/dev/null 2>&1
# ..
# ..
wget LINK4000 >/dev/null 2>&1
しかし、1行1行をコマンドが終了するまで処理し、次のコマンドに移るのは非常に時間がかかります。例えば、20行を一度に処理し、それが終了したらまた20行を処理したいのですが、どうすればよいでしょうか?
そこで考えたのが
wget LINK1 >/dev/null 2>&1 &
しかし、4000行もあるため、パフォーマンスの問題はもちろん、同時に起動するプロセスの数にも制限があるため、良いアイデアとは言えません。
今考えている解決策のひとつは、あるコマンドがまだ実行されているかどうかをチェックすることで、たとえば20行後にこのループを追加することができます。
while [ $(ps -ef | grep KEYWORD | grep -v grep | wc -l) -gt 0 ]; do
sleep 1
done
もちろん、この場合は行末に&を追加する必要があります。でも、このやり方は正しくないような気がします。
このスクリプトは動的に生成されるので、生成中に好きな計算をすることができますが、wgetを使う必要はありません。
どのように解決するのですか?
を使用します。
wait
を内蔵しています。
process1 &
process2 &
process3 &
process4 &
wait
process5 &
process6 &
process7 &
process8 &
wait
上記の例では、4つのプロセス
process1
...
process4
がバックグラウンドで開始され、シェルはそれらが完了するまで次のセットを開始するのを待ちます。
からは GNUマニュアル :
wait [jobspec or pid ...]
各プロセスID pid またはジョブ指定 jobspec で指定された子プロセスが終了するまで待ち、最後の コマンドを待機させる。ジョブ仕様が指定された場合、そのジョブ内の全プロセスが待機します。 を待ちます。引数が与えられない場合,現在アクティブなすべての子プロセスが待機する。 プロセスが待ち受けられ,戻り値は0である。もし は、シェルのアクティブな子プロセスを指定します。 は127である。
関連
-
[解決済み] Bashスクリプトでスクリプトファイル名を知るには?
-
[解決済み] Bashスクリプトのソースディレクトリをスクリプト自体から取得するにはどうすればよいですか?
-
[解決済み] Bashシェルスクリプトでディレクトリが存在するかどうかを確認するにはどうすればよいですか?
-
[解決済み] Bashスクリプトからプログラムが存在するかどうかを確認するにはどうすればよいですか?
-
[解決済み] Bashシェルスクリプトの入力引数の存在確認
-
[解決済み] Bashスクリプトでカレントディレクトリ名(フルパスなし)を取得する
-
[解決済み] bashスクリプトでset -eはどういう意味ですか?
-
[解決済み] Bashで変数が数値であるかどうかをテストするにはどうすればよいですか?
-
[解決済み] OS X:Linuxのwgetに相当するもの
-
[解決済み】Bashスクリプトでクリップボードにパイプを接続する
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
Linuxでファイルパーミッションを与えるには?Linuxでファイルに実行可能なパーミッションを追加するためのヒント
-
rsyncとinotfiyの組み合わせでリアルタイムバックアップ問題を実現
-
中国版「浮世」を含むUbuntu 20.04.2リリース
-
deepin linuxでroot権限に切り替えるには?Deepinでrootに切り替えるためのヒント
-
Linux Mintでフェード効果をオンにする方法は?
-
TclError: 表示名がなく、$DISPLAY環境変数もない。
-
[解決済み] xargsを使ったプログラムの並列実行
-
[解決済み] Unix/Linuxで、ファイルのあるフォルダを別のフォルダにコピーするにはどうしたらいいですか?[クローズド]
-
[解決済み] どのバージョンのPostgreSQLを使用していますか?
-
[解決済み] bashスクリプトから複数のプログラムを並列に実行するにはどうすればよいですか?