ジョブ制御
ジョブ制御とは
シェル(cshやBash)に組み込まれた機能で,実行中のプロセスを中断状態にしたり,バックグラウンド動作に移行したりするもの。
中断状態のジョブを実行に移したり,バックグラウンドからフォアグラウンドに戻すこともできる。
ジョブの状態
フォアグラウンド
通常の状態。
端末から入力したキー入力データがフォアグランドのプロセスに渡される。
フォアグラウンドプロセスは,ある時点で一つだけ。
バックグラウンド
バックグラウンドで動作するプロセス。
バックグラウンドプロセスにはキー入力を渡せないが,画面への表示は可能。
フォアグラウンドプロセスの画面表示にバックグラウンドグラウンドプロセスの画面表示が混入するとわかりにくいので,バックグラウンドプロセスから画面表示するときは要注意。
中断状態
プロセスは実行を中断している状態。
ジョブ制御の操作
バックグラウンドでのプロセス実行
外部コマンドを起動するときに,コマンドラインの最後に'&'を付加すればバックグラウンドで実行する。
実行例
[toshim@gw2000 ~/work]$ cat > xxx &
[1] 9876 ← [1]はジョブ番号,9876はプロセスID
[1]+ Stopped (tty input) cat >xxx ← バックグランドに入った直後,キー入力待ちとなり,プロセスは中断状態に自動的に移行
|
Ctrl-Z
フォアグラウンドプロセスを実行しているときに,Ctrl-zキーを押すとそのプロセスは中断状態となる。
実行例
[toshim@gw2000 ~/work]$ less test1
This is a file for test.
test1 (END) ← ここまで表示したところでCtrl-Zを押す
[1]+ Stopped less test1
|
ジョブの表示
jobsコマンドでアクティブなジョブを一覧表示する。
実行例
[toshim@gw2000 ~/work]$ cat > xxx &
[1] 9878
[1]+ Stopped (tty input) cat >xxx
[toshim@gw2000 ~/work]$ man less &
[2] 9879
[2]+ Stopped (tty output) man less
[toshim@gw2000 ~/work]$ jobs
[1]- Stopped (tty input) cat >xxx
[2]+ Stopped (tty output) man less
|
fgコマンド
fg [jobspec]
fgコマンドでバックグラウンドあるいは中断中のプロセスをフォアグラウンドに移行できる。
jobspecは下記のようにしてジョブを指定する。詳しくはこちらを参照。
| なし |
最後のジョブ |
| %番号 |
ジョブ番号が番号に一致するジョブを指す |
実行例
[toshim@gw2000 ~/work]$jobs
[1]- Stopped (tty input) cat >xxx
[2]+ Stopped less test1
[toshim@gw2000 ~/work]$fg %1
cat >xxx ← catコマンドがフォアグラウンドに戻った
|
bgコマンド
bg [jobspec]
bgコマンドで中断中のプロセスがバックグラウンドプロセスに移行する。
jobspecの指定方法はfgコマンドと同じ。
実行例
[toshim@gw2000 ~/work]$ping www
PING ns1.glasscom.com (210.160.91.225): 56 data bytes
64バイト応答 送信元 210.160.91.225: ICMP_Seq=0 TTL=128 時間=0.5ミリ秒
64バイト応答 送信元 210.160.91.225: ICMP_Seq=1 TTL=128 時間=0.5ミリ秒
64バイト応答 送信元 210.160.91.225: ICMP_Seq=2 TTL=128 時間=0.5ミリ秒
ここでCtrl-Zを押す
[1]+ Stopped ping www
[toshim@gw2000 ~/work]$bg %1
[1]+ ping www &
[toshim@gw2000 ~/work]$64バイト応答 送信元 210.160.91.225: ICMP_Seq=3 TTL=128 時
間=0.5ミリ秒
64バイト応答 送信元 210.160.91.225: ICMP_Seq=4 TTL=128 時間=0.5ミリ秒
64バイト応答 送信元 210.160.91.225: ICMP_Seq=5 TTL=128 時間=0.5ミリ秒
(以下省略)
|
ジョブの強制終了
kill [jobspec | process ID]
killコマンドはSIGTERMシグナルをプロセスに送り,プロセスは終了する。
jobspecの指定方法はfgコマンドと同じ。
実行例
[toshim@gw2000 ~]$jobs
[1]- Stopped (tty input) cat >xxx
[2]+ Stopped (tty output) man less
[toshim@gw2000 ~]$kill %1
[1]- Stopped (tty input) cat >xxx
[toshim@gw2000 ~]$
[1]- Terminated cat >xxx ← 強制終了には少し時間がかかるので,次のコマンドプロンプトの後停止したもの
|
ログアウト時の注意
exitコマンドでシェルを抜けるとき,中断中のプロセスがあると,最初の1回は警告を出す。
2回目にexitコマンドを実行すると,中断中のプロセスを強制終了してシェルは終了する。
バックグランドプロセスがあるときは,それを実行させたままシェルは終了する。
ログインシェルを終了してログアウトすると,バックグラウンドプロセスは端末が割り当てられていない状態となる。 |