web-dev-qa-db-ja.com

コマンドを一度に実行する

次のコマンドを含むテキストファイルがあります

command1 file1_input; command2 file1_output
command1 file2_input; command2 file2_output
command1 file3_input; command2 file3_output
command1 file4_input; command2 file4_output
command1 file5_input; command2 file5_output
command1 file6_input; command2 file6_output
command1 file7_input; command2 file7_output
................
................
................
................
................

このファイルに「commands」という名前を付けてから、「chmod a + x "」を使用して許可を与えました。

コマンド1を実行してから、コマンド2を実行します。また、これをすべてのファイル(file1、file2、...など)に一度に適用したいと思います。このファイルの内容を変更してそれを行うにはどうすればよいですか?

次のことを試しましたが、うまくいきませんでした。

(
command1 file1_input; command2 file1_output
command1 file2_input; command2 file2_output
command1 file3_input; command2 file3_output
command1 file4_input; command2 file4_output
command1 file5_input; command2 file5_output
command1 file6_input; command2 file6_output
command1 file7_input; command2 file7_output
................
................
................
................
................
)&
5
user88036

そのように行を作成します。

(command1 file1_input; command2 file1_output) &
(command1 file2_input; command2 file2_output) &
...

また、各行は2つのコマンドを順番に実行しますが、各行は並列バックグラウンドジョブとして分岐します。

最初のコマンドが正常に完了した場合にのみ2番目のコマンドを実行する場合は、セミコロンを&&に変更します。

(command1 file1_input && command2 file1_output) &
(command1 file2_input && command2 file2_output) &
...
3
Jeff Schaller

GNU parallel これを行います:

$ parallel < /path/to/file/containing/commands

GNUプロセスを並列管理することと、すべてを同時にバックグラウンドで実行することの利点は、GNU並列で、同時ジョブの数を--jobs--load--memfreeなどを介して、システムのメモリと処理能力の範囲内にとどまります。

ファイル内のすべての行を同時に実行するだけでは、システムをRAMまたはCPUパワーが不足しているため、非常に遅くなります。システムがクラッシュすると、プロセスがクラッシュし始める可能性があります。最初にRAMが不足し、次にスワップスペースが不足します。

6
Warren Young