それマグで!

知識はカップより、マグでゆっくり頂きます。 takuya_1stのブログ

習慣に早くから配慮した者は、 おそらく人生の実りも大きい。

bashのジョブ(bg/fg)とお手軽kill

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つのモードが有ります。

f:id:takuya_1st:20170101174002j:plain:w500

動いているものを 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

記述を修正