ジョブ制御のコマンド/運用演習
長めの処理を誤って終了せずに一時停止し、背景で続ける演習です。端末に出るジョブ番号とPIDを自分の実行結果から読み取り、別シェルや非対話環境の結果を混ぜずに検証します。
この単元で学ぶこと
- ジョブ番号・PID・前景・背景の違いを説明できる
- jobs・fg・bgと端末からのシグナルを使い分けられる
- 自分の対話シェルで対象を確認し操作結果を検証できる
本文解説
実験の環境 他の仕事を動かしていない対話Bashを使います。jobsが既存処理を表示するなら別の専用端末を用意します。Bashではecho "$-"にiが含まれると対話シェル、set -oのmonitorがonならジョブ制御有効の目安になります。PIDや番号は固定値を丸写しせず画面から読み取ります。
前景で開始 sleep 60を&なしで実行します。すぐにプロンプトが戻らないのは、前景のsleepをシェルが待っているためです。処理が故障したとは限りません。60秒待てば正常に終わりますが、一時停止の練習では満了前にCtrl+Zを押します。
停止の証拠 停止通知後にjobs -lを実行してStoppedと番号を記録します。例えば[1] 5200ならジョブ指定は%1であり、%5200ではありません。Ctrl+Zの通常のSIGTSTPはアプリが扱えるため、キーを押した事実だけで必ず停止したとせず状態を確認します。
背景で継続 bg %1で続け、jobs -lを再実行します。sleepがまだ期限前ならRunningが見え、プロンプトは利用できます。Runningという表示はジョブが停止していないことを表し、OSのpsのRと同じ意味でCPUをずっと使うとは限りません。sleepは待機状態にもなります。
前景へ戻す fg %1を実行すると再びそのsleepを待つ状態になります。まだ動いていればCtrl+Cで通常SIGINTを送り、終了後にjobsを確認します。途中で時間満了した場合はno such jobとなることがあるので、消えた番号を新しい別ジョブへ無条件に流用しません。
端末入力が必要な処理 入力を求めるコマンドを&で背景へ置いて停止したなら、権限不足と決める前に端末読取りを確認します。前景へ戻して入力する、または入力ファイルを渡すなど、処理の入力源を決めます。bgを繰返すだけでは再び入力待ちで停止する場合があります。
別の端末では調査方法を変える 端末Aのjobs番号を端末Bのfgへ渡してもAの管理表は操作できません。全体の実体はpsでPIDや所有者を確認します。PIDへシグナルを送る操作と、同じシェル内でジョブを前景へ戻す操作を区別します。
成果物を残す 対話状態、monitor、停止前後のjobs -l、実行したbg/fg、最後の終了確認を記録します。非対話テストで確認できる$!やwaitだけではCtrl+Zと前景グループの実技検証は代替できません。実機で未実行なら未実行として、状態遷移の期待値と分けて残します。
図解
重要ポイント
- jobsは現在シェルのジョブ一覧であり全プロセス一覧ではない。
- %ジョブ番号とPIDを分けて指定する。
- Ctrl+Zは停止、bgは背景継続、fgは前景化。
- 背景実行だけで端末入力や切断後の継続を保証しない。
間違えやすい点
- 他端末のジョブ番号を流用しない。
- 停止を正常終了と報告しない。
- 非対話スクリプトでfg/bgが同じように使えると仮定しない。
用語解説
- ジョブ
- シェルが管理するパイプライン等の実行単位。一つ以上のプロセスを含む。
- 前景
- 端末の前景プロセスグループとして動く状態。
- 背景
- 前景以外で動き、通常シェルが入力受付へ戻れる状態。
- ジョブ指定
- %1等、そのシェルのジョブを指定する記法。
- SIGTSTP
- 通常Ctrl+Zで前景グループへ送られる停止シグナル。アプリ側で扱える。
関連教材
参考資料
教材データに登録された参考リンクです。リンク先の内容や更新日は提供元でご確認ください。
確認問題の出題・採点や学習履歴の保存にはログインが必要です。