プロセスの基本のコマンド/運用演習
「処理が終わらない」という連絡から、同名の別処理を止めずに調査する練習です。Linuxの一覧例と、自分で作った短い子プロセスを使い、観測・終了要求・終了状態の記録を順番に行います。
この単元で学ぶこと
- PID・PPID・所有者・状態を一覧から読める
- シグナルと終了確認を区別して扱える
- 専用プロセスで起動・観測・待機・終了を検証できる
本文解説
同名の処理を区別する 一覧に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のサービス状態もこの実験だけでは検証できません。環境差による未実行項目は結果と分けて明記します。
図解
重要ポイント
- PIDは実行中の識別子、PPIDは親の識別子。
- 一覧の対象・所有者・時点を確認する。
- シグナル送信成功と終了完了は別。
- TERMによる終了要求、STOP/CONTの一時停止、KILLの強制終了を区別する。
間違えやすい点
- 名前が同じだけで別ユーザーの処理を操作しない。
- ZをKILLで動かない処理のように直そうとしない。
- 古いPIDの再利用と確認後の状態変化に注意する。
用語解説
- PID
- プロセスを識別する番号。終了後に再利用されることがある。
- PPID
- 親プロセスのPID。
- シグナル
- プロセスへ事象や要求を伝える仕組み。
- ゾンビ
- 終了済みだが終了情報が親に回収されていないプロセス状態。
- wait
- シェルが子の終了などを待ち、終了状態を受け取る組込みコマンド。
関連教材
参考資料
教材データに登録された参考リンクです。リンク先の内容や更新日は提供元でご確認ください。
確認問題の出題・採点や学習履歴の保存にはログインが必要です。