LoginSignup
125
66

シェルのバックグラウンド実行って後だしできるって知ってました?

Last updated at Posted at 2024-02-26

この前までの私のちょっと時間のかかるバッチ実行の日常

「よっしゃー、今日はバッチ処理やるで!」と気合い入れて、タタタタッターン(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

今回の件の教訓

今回のケースは既に知っている人も多いかもしれませんが、私はこれまでなぜか遠回りの方法をとっていました。作業の中には、同様に非効率的な方法で行っていることが他にもあるかもしれません。ですから、面倒だと思っている作業に対しても、違和感を持ち、改善方法を積極的に調べるようにしようと思います。

125
66
5

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
125
66