Section Next | Prev


3.3.4 ジョブ・コントロール

ジョブ
1度のキー操作で投入するコマンド(パイプライン、セミコロンで区切られたコマンド群 を含む)は、ジョブと言います。
通常シェルは、コマンドの実行が終了するまで待ち、終了したらプロンプトを表示し 次の入力待ちとなります。
	$ date ; who | wc	# この一行で1ジョブ、3コマンド
	Mon Sep 24 21:09:39 JST 2007
	      1       6      68
コマンドが終了する前に、キーボードからコマンド操作を指示することはできますが、 コマンドの実行はあくまでも、個々のジョブが完了してからになります。
	$ date ; sleep 10	# この時点で Enter を入力
	Mon Sep 24 21:14:58 JST 2007
	date	# まだ処理は終わってないがコマンド入力はできる
	$ date	# 上記の sleep が完了してから、先行入力したコマンドを実行
	Mon Sep 24 21:15:08 JST 2007
コマンドの終わりにアンド(&)を付けると、 シェルはそのコマンドの終了を待たずにプロンプトを表示し、次のコマンドの入力待ちになります。
	$ date; sleep 10 &
	Mon Sep 24 21:15:20 JST 2007
	[1] 21461
	$ date	# 上記ジョブ投入直後にプロンプトが表示される
	Mon Sep 24 21:15:20 JST 2007	# 結果 date コマンド2つは同時に実行される
	$ pwd
	/home/ycos/shell/wk
	[1]+  Done                    sleep 10

ジョブ制御
このように、終了をまたずに実行されるジョブをバックグランドジョブとよび、 既存の実行終了を待つジョブの事をフォアグランドジョブと言います。

フォアグラウンドジョブはキーボードと直結されるため、同時期に1つだけですが、 バックグラウンドジョブは複数実行させることができます。
各バックグラウンドジョブにはジョブ番号とよばれる通し番号で管理され、 それを指定することで、フォアグラウンドへの付けかえ、一時停止、強制終了を 行うことができます。ジョブの一覧は jobs で確認できます。

$ sleep 100# フォアグラウンドを一時停止
^Z# 実際には ^Z は表示されません
[1]+ Stopped
$ bg %1# 一時停止したジョブをバックグランドで再開
[1]+ sleep 100 >
$ jobs# ジョブの一覧
[1]+ Running
$ kill %1# バックグラウンドの強制終了

機能フォアグラウンド バックグラウンド
一時停止^Z stop %job
強制終了^C kill %job
切り替えbg %job fg %job

ジョブ番号
一時停止中のバックグラウンドで再開するには bg コマンドを、 フォアグラウンドで再開するには fg コマンドを使用します。 どちらも特定のジョブを指定できます。
	bg %ジョブ番号
 	fg %ジョブ番号
カレントジョブ(直近のジョブ)は、ジョブ番号を省略することができます。 カレントジョブは jobs コマンドで、プラス(+)が付加さ表現されています。
現在走っているジョブが、1つしかない時はそのジョブが常にカレントジョブであり ジョブ番号なしでコントロールできます。

一時停止中のジョブがある時に、新たにジョブを停止すると後から投入されたジョブが カレント・ジョブに変わります。この時カレント・ジョブはプレビアスジョブ (直前のジョブ)に変わり、jobs コマンドで、マイナス(-)印で表現されます。
カレントジョブ、プリビアスジョブはそれぞれ %+, %- で指定できます。

	$ jobs
	[1]   Stopped                 cat
	[2]   Stopped                 wc
	[3]-  Stopped                 tail -f -
	[4]+  Stopped                 head -

	$ fg
	head -
	[4]+  Stopped                 head -

	$ fg %-
	tail -f -
	[3]+  Stopped                 tail -f -
補足事項
バックグラウンドジョブが残った状態で終了(logout)しようとすると警告が表示されます。 これはログアウトによってジョブが強制終了される可能性があるためです。
	$ exit
	logout
	There are stopped jobs.
再度、ログアウトを指示すればバックグラウンドジョブを強制終了し、ログアウトします。


Section Next | Prev

Copyright 2007-2018 ycosSystems Shell/Body334.html