この前までの私のちょっと時間のかかるバッチ実行の日常
「よっしゃー、今日はバッチ処理やるで!」と気合い入れて、タタタタッターン(bash xxxx.sh + Enter)。
おっと、またやらかしたわ。コマンドの末尾に&
つけんの忘れたら、プロセスがフォアグラウンドで動いてまうねん。
これやと、ターミナルがこのタスクに独り占めされてまうわ。
この状況をどうにかするには、Ctrl+C
でプロセスを止めてからやり直すか、それとも別のターミナルウィンドウを開くしかないねん。めっちゃ面倒くさいなあ。
今後の私のちょっと時間のかかるバッチ実行の日常
「さて、本日はバッチ処理の実施日でございますね」と心に留めました。
タッタタタッターン。
あら、不覚にも再び&
を添え忘れてしまい、結果としてフォアグラウンドでの実行を余儀なくされました。
しかし、ご心配なく。
まずは、Ctrl+Z
を駆使してプロセスを一時停止いたします。
続いて、下記のコマンドを使用し、プロセスをバックグラウンドで再開いたします。
bg
解説
長々と述べましたが、要は
フォアグラウンドで実行 → 一時停止 → バックグラウンドで再開
の手順を踏んだだけです。
複数のタスクを一時停止した場合はどうなるのでしょうか?
ケース1:引数なしでバックグラウンド再開
bg
コマンドを引数なしで実行すると、最も最近に一時停止したタスクが再開されます。
一時停止したタスクはスタックされるようになります。
$ sleep 10 # sleepコマンドで10秒待機
^Z # Ctrl+Zで一時停止
zsh: suspended sleep 10
$ sleep 11
^Z
zsh: suspended sleep 11
$ bg # 引数なしでバックグラウンド再開
[2] - continued sleep 11
$ bg
[1] - continued sleep 10
ケース2:引数でジョブを指定してバックグラウンド再開
引数でジョブ番号を指定することで、特定のタスクを明示的に再開できます。
$ sleep 10
^Z
zsh: suspended sleep 10
$ sleep 11
^Z
zsh: suspended sleep 11
$ jobs # ジョブ番号を確認
[1] - suspended sleep 10
[2] + suspended sleep 11
$ bg %1 # ジョブ1を再開
[1] - continued sleep 10
$ bg %2 # ジョブ2を再開
[2] + continued sleep 11
今回の件の教訓
今回のケースは既に知っている人も多いかもしれませんが、私はこれまでなぜか遠回りの方法をとっていました。作業の中には、同様に非効率的な方法で行っていることが他にもあるかもしれません。ですから、面倒だと思っている作業に対しても、違和感を持ち、改善方法を積極的に調べるようにしようと思います。