ジョブ制御のコマンド/運用演習

長めの処理を誤って終了せずに一時停止し、背景で続ける演習です。端末に出るジョブ番号と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で前景グループへ送られる停止シグナル。アプリ側で扱える。

関連教材

参考資料

教材データに登録された参考リンクです。リンク先の内容や更新日は提供元でご確認ください。

確認問題の出題・採点や学習履歴の保存にはログインが必要です。