GNU Parallel はシェルスクリプトの並列処理を簡単に実現できるツール。
一番シンプルな使い方は、標準入力でコマンドを受け取り、それを並列で実行するというもの。以下のようなオプションをよく使うのでコピペ&振り返りがしやすいようにまとめておく
cat tasks.txt | parallel --jobs 40% --bar --joblog joblog.tsv --result joblog.tsv --timeout 30mtasks.txtのそれぞれの行に実行したいシェルスクリプトを記入しておく--barはプログレスバーで進捗を表示--barは--etaの強化版。--etaは--progressの強化版。とりあえず--barを使っておけば問題ない- ただし、
--barや--etaを使うと、コマンドが全部でいくつであるかを先に知る必要が出るため、すべてのコマンドを受け取り終わってからでないとコマンドの実行が始まらない。
- ただし、
- parallel でコマンドを実行する際、出力はコマンド全体が終わるまで画面に書き出されないのだが、
--lbを指定するとコマンドの出力を随時画面に書き出す。--barとは相性が悪いが、結果を常に確認したいときに使うとよい
--jobsで CPU 使用率を指定する代わりに-j 4のようにすると並列処理数を直接指定できる--halt now,fail=1とすると 1 つでもジョブが失敗したらその時点で止める--joblog joblog.tsvでコマンド実行履歴をファイルに保存しておける。更に以下のオプションを付けることで、この実行履歴を再実行に使うことができる--resumeでまだ実行していなかったタスクを再実行できる--retry-failedで失敗したタスク(エラーコードが非ゼロのタスク)だけをもう一度実行できる--resume-failedで失敗したタスクとまだ実行していなかったタスクを両方再実行できる
--results parallel_log- コマンド・標準出力・標準エラー出力がこのディレクトリ内にそれぞれ保存される。
--timeout 30m- 30 分でジョブを強制終了する。固まったジョブが CPU・キューを占有し続けるのを防ぐのに使える。一つのジョブがあまりに長時間かかっている場合、何か問題があって詰まっている場合が多い。
parallel_logに書き出されている出力などをもとに原因を修正してから--retry-failedを行えば再実行できる
- 30 分でジョブを強制終了する。固まったジョブが CPU・キューを占有し続けるのを防ぐのに使える。一つのジョブがあまりに長時間かかっている場合、何か問題があって詰まっている場合が多い。