ジョブ制御を理解する
Bashのジョブ制御は、一つの対話シェルから起動した処理を前景・背景へ切り替える仕組みです。ジョブ番号はそのシェルの管理番号で、OSのPIDとは別です。対話端末上の専用のsleepを使い、停止と終了を区別して操作します。
この単元で学ぶこと
- ジョブ番号・PID・前景・背景の違いを説明できる
- jobs・fg・bgと端末からのシグナルを使い分けられる
- 自分の対話シェルで対象を確認し操作結果を検証できる
本文解説
一つのシェルの管理表 Bashはそのシェルから起動したパイプライン等をジョブとして管理します。一つのジョブが複数プロセスを含む場合もあります。jobsはこの管理表を見るコマンドで、システムの全プロセス一覧ではありません。別端末のjobsに同じ番号があっても同じ処理とは限りません。
前景と背景 前景の処理を実行している間、通常そのシェルは終了や停止を待ちます。sleep 60 &のように&を付けると背景で起動し、シェルは入力受付へ戻ります。背景は処理の場所の区別であり、終了済みという意味でも、ログアウト後の永続実行の保証でもありません。
番号を確認する 対話Bashでsleep 60 &を起動すると、例として[1] 2460のような表示になります。1はジョブ番号、2460はその単純コマンドのPIDです。実際の値は毎回違います。jobs -lで番号とPID等を確認し、fg %1やbg %1では%を含むジョブ指定を使います。
一時停止と終了 通常の端末設定ではCtrl+Zが前景プロセスグループへSIGTSTPを送り、既定の動作で処理が停止します。Ctrl+CはSIGINTで、既定では終了しますが、アプリが扱う場合もあります。停止して入力が戻っただけで処理が終了したと考えず、jobsでStopped等を確認します。
bgとfg 停止したジョブをbg %1で背景として継続でき、fg %1なら前景へ移して必要に応じて継続します。fgで前景へ移した後はシェルが再びその処理を待ちます。bgは新しいプロセスを同じコマンドで起動し直す操作ではなく、既存のジョブを続ける操作です。
背景から端末を読む場合 背景プロセスが端末入力を読もうとすると、ジョブ制御が有効な通常の条件ではSIGTTINで停止します。背景で動くから標準入力が自由に使えるわけではありません。入力ファイルやリダイレクトを用意するか、入力が必要な処理を前景へ戻すかを用途に応じて決めます。
対話端末での検証 他の作業を含まないBash端末でsleep 60を前景起動し、Ctrl+Z、jobs -l、表示された番号へのbg、jobs -l、fgを順に実行します。最後は前景の自分のsleepだけへCtrl+Cを送り、jobsで残存がないことを確認します。60秒満了などで途中終了したら、その結果を記録し存在しない番号へ続けて操作しません。
非対話と切断の注意 通常のスクリプトではジョブ制御は既定で無効です。そこでfgが失敗しても対話端末の手順と同一条件ではありません。nohupは主にSIGHUPへの扱いを変える道具で、それだけで背景化するわけではありません。長時間の運用処理は端末からの独立、入力出力、再起動や監視の要件も設計します。
図解
重要ポイント
- jobsは現在シェルのジョブ一覧であり全プロセス一覧ではない。
- %ジョブ番号とPIDを分けて指定する。
- Ctrl+Zは停止、bgは背景継続、fgは前景化。
- 背景実行だけで端末入力や切断後の継続を保証しない。
間違えやすい点
- 他端末のジョブ番号を流用しない。
- 停止を正常終了と報告しない。
- 非対話スクリプトでfg/bgが同じように使えると仮定しない。
用語解説
- ジョブ
- シェルが管理するパイプライン等の実行単位。一つ以上のプロセスを含む。
- 前景
- 端末の前景プロセスグループとして動く状態。
- 背景
- 前景以外で動き、通常シェルが入力受付へ戻れる状態。
- ジョブ指定
- %1等、そのシェルのジョブを指定する記法。
- SIGTSTP
- 通常Ctrl+Zで前景グループへ送られる停止シグナル。アプリ側で扱える。
関連教材
参考資料
教材データに登録された参考リンクです。リンク先の内容や更新日は提供元でご確認ください。
確認問題の出題・採点や学習履歴の保存にはログインが必要です。