プロセスとジョブのコマンド/運用演習

「処理が終わらない」という連絡から、同名の別処理を止めずに調査する練習です。Linuxの一覧例と、自分で作った短い子プロセスを使い、観測・終了要求・終了状態の記録を順番に行います。

この単元で学ぶこと

  • PID・PPID・所有者・状態を一覧から読める
  • シグナルと終了確認を区別して扱える
  • 専用プロセスで起動・観測・待機・終了を検証できる
  • ジョブ番号・PID・前景・背景の違いを説明できる

本文解説

同名の処理を区別する 一覧にPID310 USER=alice ARGS=sleep 60、PID420 USER=bob ARGS=sleep 60があるとします。aliceが今回起動した処理が310と分かっているなら、420を同名という理由で操作しません。さらに開始時刻や親を確認し、観測後に対象が終了する競合も考慮します。

親子を読む PID310 PPID300なら310の親は300です。300も同じ表にあれば親の引数や所有者を確認します。PPIDを子の一覧と誤認しないでください。親が終了した後の関係は変わり得るため、一枚の過去出力で現在の関係を断定しません。

待機と停止を分ける sleepは時間待ちでSとなることがあります。STOPで止めればTになります。Zは既に終了した子の回収待ちです。この三つをすべて「動かないのでKILL」と同じ対処にすると原因を見失います。状態と対象アプリの目的を合わせて判断します。

最小の終了コード実験 Bashでsh -c "exit 7" &を実行し、直後にpid=$!を保存してwait "$pid"; rc=$?; printf "%s\n" "$rc"を実行すると7です。背景起動の直後の$?と、wait後の子の終了状態は別です。子が既に終了していても、そのシェルが保持する終了状態をwaitで受け取れます。

終了要求の実験 sleep 60 &、pid=$!、psで対象確認、kill -TERM "$pid"、wait "$pid"、rc=$?の順を崩さずに実施します。Bashではシグナル終了のwait状態は128より大きくなります。wait後にpsを取り、対象の消失とコマンド状態の両方を記録します。既存サービスを練習対象にはしません。

一時停止の実験 実Linuxの専用Bashで自分のsleepを作り、STOP、psでT、CONT、psで待機等へ戻ることを確認します。途中で60秒が満了すれば既に終了しているため、固定の状態を必ず見ると決めつけません。最後にTERMとwaitでその子だけを終了確認します。状態は観測の時点で変わります。

ゾンビと親の役割 Zは既に終了しているため、そのPIDへさらに終了要求を重ねても親の回収処理の代わりにはなりません。親がwaitなどで終了情報を受け取る仕組みを確認します。親の再起動等が必要かは運用影響を検討する別作業で、一覧を見ただけで一律に親を終了させません。

記録を読み直す 実験記録には使用したシェル、OS、起動時PID、psの列、送ったシグナル、waitの状態を残します。MSYSやmacOSのpsはLinux procpsと同じとは限らず、systemdのサービス状態もこの実験だけでは検証できません。環境差による未実行項目は結果と分けて明記します。

実験の環境 他の仕事を動かしていない対話Bashを使います。jobsが既存処理を表示するなら別の専用端末を用意します。Bashではecho "$-"にiが含まれると対話シェル、set -oのmonitorがonならジョブ制御有効の目安になります。PIDや番号は固定値を丸写しせず画面から読み取ります。

停止の証拠 停止通知後に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となることがあるので、消えた番号を新しい別ジョブへ無条件に流用しません。

別の端末では調査方法を変える 端末Aのjobs番号を端末Bのfgへ渡してもAの管理表は操作できません。全体の実体はpsでPIDや所有者を確認します。PIDへシグナルを送る操作と、同じシェル内でジョブを前景へ戻す操作を区別します。

図解

同名から実体へ絞る
名前が同じ二つの処理を、PIDと所有者、起動記録で区別する。

重要ポイント

  • PIDは実行中の識別子、PPIDは親の識別子。
  • 一覧の対象・所有者・時点を確認する。
  • シグナル送信成功と終了完了は別。
  • TERMによる終了要求、STOP/CONTの一時停止、KILLの強制終了を区別する。

間違えやすい点

  • 名前が同じだけで別ユーザーの処理を操作しない。
  • ZをKILLで動かない処理のように直そうとしない。
  • 古いPIDの再利用と確認後の状態変化に注意する。

用語解説

PID
プロセスを識別する番号。終了後に再利用されることがある。
PPID
親プロセスのPID。
シグナル
プロセスへ事象や要求を伝える仕組み。
ゾンビ
終了済みだが終了情報が親に回収されていないプロセス状態。
wait
シェルが子の終了などを待ち、終了状態を受け取る組込みコマンド。
ジョブ
シェルが管理するパイプライン等の実行単位。一つ以上のプロセスを含む。
前景
端末の前景プロセスグループとして動く状態。
背景
前景以外で動き、通常シェルが入力受付へ戻れる状態。
ジョブ指定
%1等、そのシェルのジョブを指定する記法。
SIGTSTP
通常Ctrl+Zで前景グループへ送られる停止シグナル。アプリ側で扱える。

関連教材

参考資料

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

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