bash のジョブの概念とコントロール
bash のジョブの話とkill の話。
Ctrl+zでプロセスはどこへ行くのか?
takuya@~$ ログアウト 停止しているジョブがあります。 takuya@~$
停止してるジョブってなんだよ!!!ってなる人が多い。
ジョブはどこに行った。
bash のプロセスはどこで管理されているのか。
ジョブの停止を知らないと、「停止してるジョブがでるから」、とタブ開きまくってませんか? screen / tmux でバンバンとタブ開けてませんか?
そのタブ本当に必要ですか?ジョブの停止と再開を知らないだけではありませんか?
実は、bash で起動したプログラムは ジョブとして いま使ってたその、bash が管理しています。
また、ジョブはSTDOUT/STDIN を繋いでるだけなので切り替えて使えます。
ジョブは恥だが役に立つ。
ジョブを切り替えていると、 tmux も screen もタブもほとんど使いません。
ある人に言わせるとダサいと揶揄されます。恥ずかしい気持ちにされることが有ります。
でも、わたしは、tmuxの代わりにジョブ切り替えをメインで使っています。
周囲にはジョブを切り替えてバンバン使う人を余り見かけないのですが。実はすごく役に立つ。
ジョブ使用例:ファイルの編集中にファイルを実行したい
ファイルを編集しているときに。
vim my_sample.sh
つくった スクリプトをシンタックスチェックや、ちょっと実行したいときにどうします?
編集中にちょっと実行したい。
bash my_sample.sh と ちょっと実行したいとき。みなさんはどうしますか?
別タブで開く?tmux 使う? vimproc 使う?それとも根本的にVimをつかわずIDEでやりますか?
実はその殆どの処理は・・・・ジョブ管理で終わるのです。
そのタブちょっと待って、それ job で済むかもよ?
覚えるコマンドはつぎの3つです。
- fg
- bg
- jobs
操作方法を覚える
そしてジョブの操作のために覚えるものは
- Ctrl+z
- kill
- command &
です。
Ctrl+z
で ジョブをバックグラウンドに入れて、kill することが出来る。
$ vim my_sample.php CTRL+Z $ php my_sample.php $ fg
この切替にいちいちタブを使う必要はありません。
そんなことしなくても ctrl+z で一時停止すればいいのです。
vim 中に Ctrl+Z で一時停止
実行中に Ctrl + Z でvim を一時停止し、スクリプトを実行し、fg でもとに戻します。
ジョブコントロールの概念
vim のモードと同じように bash のジョブコントロールには3つのモードが有ります。
動いているものを Ctrl+z で一時停止へ
一時停止をすると一時停止します。
一時停止から bg で バックグラウンドで起動
複数のプロセスがバックグラウンドにある場合。
$ bg 2 # job 2 をバックグラウンドにする
job の読み方
複数のコマンドを起動して切り替えて使うのに jobs を使いましょう。
jobs を実行すると次のように、現在実行(停止中)の実行中プログラム一覧が出てきます。
まずはじめに、ジョブを起動して一時停止してみます。
takuya@Desktop$ man bash [1]+ 停止 man bash takuya@Desktop$ man vim [2]+ 停止 man vim takuya@Desktop$ man gawk [3]+ 停止 man gawk
man を実行して、表示しているときに Ctrl-Z を押すと、コマンドが一時中断されて、シェルプロンプトに戻ってきます。
この状態で、jobsコマンドを叩きます。すると。。。
takuya@~$ jobs [1] 停止 man bash [2]- 停止 man vim [3]+ 停止 man gawk
これら、3つのジョブはすべて一時停止されていることがわかります。
ここから、次のようにすると、コマンドを再開することができます。
fg 番号
- fg 3 とすれば、 3 つまり man gawk が最前面に来ます。
- fg 2 とすれば、2 つまり man vim が最前面に来ます。
- fg 1 とすれば、2 つまり man bash が最前面に来ます。
fg 1 と fg は同じです。
単にfg と打てば、 + がついてるものが出てきます。
これは、スタックと呼ばれるもので、上に積んだもの(最後に使ったもの)が最上位に来ています。次はこれについて見てきます。
ジョブスタックについて
ジョブは、番号とスタックの両面で管理されています。
先程のジョブ一覧をもう一度よく見てみます。
takuya@~$ jobs [1] 停止 man bash [2]- 停止 man vim [3]+ 停止 man gawk
数字の他に記号がついていることに気づくと思います。これがスタックを示しています。
スタック(最後に使った順) No.1 + No.2 - No.3 なし
単純に、fg bg を繰り返したとき、最初に出てくるものは、このスタック順に取り出されているのです。
いちいち kill pidしてませんか?
シェルで実行し、バックグラウンドプログラムを終了するのに、プロセス番号を指定してませんか。jobsをちゃんと理解してない人にありがちです。
job 管理されているなら、 ps で pid を見なくても kill 出来るんです。
kill %3
でジョブ3を削除できます!便利すぎる。
もういちいち、PID確認しなくていいんですよ。
job 放置したらどうなるの
放置したまま、ログアウトしたらどうなるのか。
HUP
します。
ジョブ使いましょう。
ここまでやってみてどうでしたでしょうか。Ctrl-Zの意味はわかりましたか?ジョブを複数起動して切り替えるという意味がわかったでしょうか。
複数のコマンドを起動するのであれば、ジョブが一番お手軽で便利です。
vim でファイルを編集しながら他のファイルを見たり実行したりするのもお手軽ですし、なにもインストールが必要ありません。bashだけで完結します。
ターミナルのタブ機能、またscreenやtmuxに頼りがちな人は、最初にジョブを習いそびれたのではないでしょうか。
2019-08-23
記述を修正