bash バッチ ジョブ (5.1k ファイルをインプレースで圧縮) を設定して、ジョブを停止または再開する必要がある場合に、ジョブがファイル間 (1 つの処理が終了し、別の処理が開始されていない状態) になるまで待機するようにする必要があります。
pigz -9 -- rsnc*
すべてを一度に実行した場合の圧縮は次のようになります。次のようなことを検討していました。
ls rsnc* | while read file
do pigz -9 -- $file
if [ -f .intr ]
then break
fi
done
これは私の目標を達成するための信頼できる手段でしょうか? もっと良い方法はあるでしょうか?
答え1
あなたはできるtrap
[1],[2]Ctrl +信号C、INT 信号、およびwait
各プロセスの終了に使用されます。
#!/bin/bash
trap ctrl_c INT
function ctrl_c() {
wait # wait for the end of all child processes
exit # <<--- put here your exit code exit 1, ...
}
shopt -s nullglob
for f in rsnc*
do
pigz -9 -- $file & # Execute in background
wait $! # Wait for the end of the last command
done
注記
ディレクトリ内のすべてのファイルを巡回する方法は多数あります[3]、しかしそれは常に出力を解析するのは避けた方が良いls
[4]。
参考文献
- Bash で ctrl-c をトラップする、簡単な例。
- 罠初心者のための Bash ガイド - 第 12 章より。
- Bash のファイルループ。
- より良い理由ls出力を解析しないようにする。