対話型シェルはジョブ制御を使い、1つの端末セッション内のパイプラインを調整します。ジョブは1プロセスまたはパイプライン全体を含み、通常は1つのプロセスグループへまとめ、端末とシェルが一単位として操作できるようにします。
プロセス · レッスン 11
ジョブ制御
対話型シェルがフォアグラウンド、バックグラウンド、停止中のジョブを管理する仕組みを学びます。
バックグラウンドジョブを開始する
& を末尾に付け、パイプラインを非同期で開始します。
$ sleep 1000 &
[1] 18420
シェルは完了を待たずプロンプトを返します。バックグラウンド化だけでは、出力のリダイレクト、制御端末からの切り離し、ログアウト後の生存は保証されません。必要なら入出力を明示的にリダイレクトし、対話型シェルより長く動かす作業にはサービスマネージャー、スケジューラー、端末マルチプレクサーを使います。
バックグラウンドジョブが制御端末を読もうとすると、端末のフォアグラウンドプロセスグループではないため、通常 SIGTTIN で停止します。
末尾の & は対話型シェルへ何を要求しますか?
シェルジョブを一覧表示する
jobs 組み込みは現在のシェルが認識するジョブを表示します。
$ jobs
[1] Running sleep 1000 &
[2]- Running sleep 1001 &
[3]+ Stopped sleep 1002
角括弧内はシェルのジョブ ID で、PID ではありません。%1 のように % を付けるとジョブ指定になります。+ は引数なしの多くのコマンドが選ぶ現在のジョブ、- は前のジョブです。
ジョブ表は1つのシェルに属するため、通常別端末のシェルは自身の jobs、fg、bg でこれらを一覧・操作できません。
jobs 組み込みは何を一覧表示しますか?
ジョブを停止・続行する
ジョブがフォアグラウンドのとき Ctrl-Z を押すと、通常端末がフォアグラウンドプロセスグループへ SIGTSTP を送り、停止後にシェルが制御を取り戻します。
$ sleep 1002
^Z
[3]+ Stopped sleep 1002
現在の停止中ジョブをバックグラウンドで続行します。
$ bg
bg は続行シグナルを送り、ジョブを端末のフォアグラウンド外に残します。停止中ジョブに使うもので、すでにバックグラウンドで実行中のコマンドを再開する必要はありません。
bg %3 は停止中のジョブ3へ何をしますか?
ジョブをフォアグラウンドへ移す
fg とジョブ指定で、端末のフォアグラウンドプロセスグループにして待ちます。
$ fg %1
引数なしでは通常 + の現在ジョブを選び、停止中ジョブはフォアグラウンドへ入ると続行されます。
fg %1 は何をしますか?
ジョブへシグナルを送る
シェルでは kill にジョブ指定を渡せます。
$ kill -TERM %1
通常、パイプラインの1要素だけでなくジョブのプロセスグループへ送ります。選択ジョブを先に確認し、強制的な段階へ進む前に SIGTERM を使ってください。ジョブ指定はシェル構文で、スクリプトや外部ツールは通常、検証済み PID またはプロセスグループ ID を使います。
プロセス ID 1 ではなく、シェルジョブ1を指す引数はどれですか?
Linux プロセスの管理と監視 で sleep など無害なコマンドを使って練習できます。
レッスン完了
ジョブ制御 を完了しました
シェルが制御する状態間でジョブを意図的に移動できるようになりました。
&で自動的な切り離しを行わず、バックグラウンドジョブを開始する。jobsで現在のシェルのジョブ表を調べる。Ctrl-Zで停止し、bgでバックグラウンド続行する。fgで選択したジョブを端末へ戻す。シグナル送信時は
%JOB_IDでシェルジョブを指定する。