ジョブ制御

UNIXでは、同時に複数のプログラムを実行することが出来る。 例えば時間のかかるディスクチェックを行わせながら、文書の編集を行うことなどがこれにあたる。 このように幾つかの仕事をしているときそれぞれの仕事をジョブと呼ぶ。 そして今制御しているジョブのことを、フォアグラウンドジョブと呼ぶ。 フォアグラウンドジョブはCtrl+Cでプロセスを止めることができる。 フォアグラウンドジョブ以外を、バックグラウンドジョブと呼ぶ。

バックグラウンドジョブ
時間のかかるジョブを実行するときにバックグラウンドで実行させ、他に別の作業を続けることができる。 バックグラウンドでジョブを走らせていれば、実行が終わるまで次のコマンドの入力を待つ必要がない。 バックグラウンドジョブとして走らせるものは、実行中には監視する必要のないもの(例えはコンパイル)など、 ユーザーが中間で指示を出す必要がないものがよい。 ジョブをバックグラウンドで動かす為には、コマンド行の最後に「&」をつける。

ジョブ制御コマンド

command &バックグラウンドの生成
psプロセス状態の表示
jobsバッググラウンドジョブの番号と状態の表示
nohup command &ログアウト後もコマンドを実行する
fg現在のジョブをフォアグラウンドジョブにする
fg %nジョブnをフォーグラウンドにする
bgカレントジョブをバックグラウンドにする
bg %nジョブをバックグラウンドにする
^Zフォアグラウンドのジョブの実行を一時停止する
stop %カレントバックグラウンドジョブを一時停止する
stop %nバックグラウンドジョブnを一時停止する
stty tostop端末へ出力するバックグラウンドジョブを一時停止する
stty -tostopバックグラウンドジョブの端末への出力を許可する
notify現在実行中のジョブの状態変化を通知する
nofity %nジョブnの状態変化を通知する
set notify任意のジョブの状態変化を通知する

バックグラウンドジョブの確認 (ps, jobs)

バックグラウンドジョブの確認は「ps」や「jobs」で行なう。

name% ps 
PID   TTY STAT   TIME COMMAND
29435 a1   R     0:02 ls -CR
29441 a1   R     0:00 find . -name *.c -print 
26473 a1   R     0:00 ps

R:runnig、S:Suspend

name% jobs
[1] + Running          ls -CR > dirall
[2] - Running          find . -name *.c -print > cpall

Run, Stopped, Terminated, Done, Exit(異常終了)

フォアグラウンドジョブを一時停止させる (Ctrl+Z, fg)

Ctrl+z

ファグラウンドでしていた仕事が一時停止され、ファグラウンドでコマンドを受け付けるようになる。

たとえば、 vi を実行中に(コマンドモードで) Ctrl+zを押したら vi が終了したので、 不思議だと思ったがそのまま仕事を続けた。 このとき vi は終了した訳ではなく一時停止状態にあったのである。 そのためログアウトしようとすると

There are stopped jobs

といってきた。 ps や jobs でみてみると vi が一時停止状態になっているのがわかる。 ではこの 一時停止状態になっているジョブを再開するにはどうしたらよいか。

fg

で再開できる。 フォアグラウンドのジョブが二つ以上ある場合は、ジョブの番号を指定して

fg %2

とする(「%」はカレントジョブ)。

フォアグラウンドジョブをバックグラウンドで実行するように変更するには (bg)

次のコマンドをフォアグラウンドからバックグラウンドへと変更する。例えば

find . -name '*.c' -print > hoge.txt

始めにCtrl+zで一時中断、これでフォアグラウンドは開放された。 その後、

bg

とすると、一時停止したジョブをバックグラウンドで実行できる。

バックグラウンドジョブを一時停止 (stop)

stop %

これでカレントジョブ「%」が一時停止する。 再開は「fg」または「bg」。目的に合わせて。