今コマンドを実行する

今コマンドを実行する

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

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
................
................
................
................
................

このファイルの名前を「command」と指定し、「権限の付与」を使用しました。修正モードa+x

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

私は成功せずに次のことを試しました。

(
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
................
................
................
................
................
)&

答え1

GNUパラレルこれを行う:

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

バックグラウンドですべてのプロセスを同時に実行することと比較して、GNU Parallelにプロセスを管理させることの利点は、GNU Parallelがシステムメモリおよび--jobs処理--load機能--memfree内にとどまるように同時ジョブ数を制限できることです。

ファイル内のすべてのラインを同時に実行すると、システムのRAMまたはCPUの電力が不足し、システムの速度が非常に遅くなる可能性があります。システムに初めてRAMが不足してからスワップ領域が不足すると、プロセスがクラッシュし始めることもあります。

答え2

線を次のようにしてください。

(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) &
...

関連情報