プロセスの基本を理解する
ファイルに保存したプログラムと、実行中のプロセスは別です。プロセスにはPID、親、所有者、状態があります。Linuxで一覧を読み、対象を確認してから必要なシグナルを送る手順を、専用の練習プロセスで学びます。
この単元で学ぶこと
- PID・PPID・所有者・状態を一覧から読める
- シグナルと終了確認を区別して扱える
- 専用プロセスで起動・観測・待機・終了を検証できる
本文解説
プログラムと実行の実体 同じコマンドを二回起動すると、通常は別のPIDを持つ二つのプロセスになります。PIDは稼働中の識別に使う番号で、プログラム名そのものではありません。終了したPIDは後で再利用され得るため、古いメモのPIDをそのまま操作対象にしないでください。
親と所有者 PPIDは親プロセスのPIDです。シェルから起動したコマンドはそのシェルの子になるのが基本ですが、プロセスの生成や親の終了などで関係は変わり得ます。所有者は操作権限にも関わります。プロセス名だけで対象を決めず、ユーザー、開始時刻、引数、親子関係を合わせます。
psで一時点を見る Linuxのprocpsのps -eo pid,ppid,user,stat,argsは全プロセスを指定した列で表示します。ps -p "$pid" -o pid,ppid,stat,argsは指定PIDへ絞ります。psは実行した時点の情報であり、結果を眺め続けても自動更新されません。繰返し観察するtopと目的を分けます。環境でオプション実装が異なる場合はman psで確認します。
状態を読む STATの先頭Rは実行中または実行可能、Sは割込み可能な待機、Dは割込み不能な待機、Tは停止、Zはゾンビです。Sだから異常、Rだから仕事が正常に終わるとは限りません。Zは終了済みなのに親の回収待ちの状態で、CPUを使い続ける生きた処理とは違います。追加記号と先頭の状態コードも分けます。
シグナルで要求する kill -TERM "$pid"は通常の終了要求を送ります。TERMにはアプリが後片付けを行う機会がありますが、無視や処理が設定されている場合もあります。killの成功は、相手が既に終了したことを保証しません。対象の状態と、必要なら成果物やログを確認します。番号よりTERMのような名前を使うと意図が伝わります。
強制終了と停止を分ける KILLは捕捉・無視できず、アプリ自身の後片付けを実行する機会を与えません。STOPは処理を一時停止し、CONTで継続できます。STOPも捕捉・無視できません。TERM、KILL、STOPは目的が異なり、停止したプロセスが削除されたとは考えません。割込み不能な待機ではKILLを送っても直ちに消えるとは限りません。
自分の練習対象を作る 専用のBashでsleep 60 &を実行し、直後にpid=$!としてその背景処理のPIDを保持します。ps -p "$pid" -o pid,ppid,stat,argsでsleep 60が対象か確認し、kill -TERM "$pid"を送ってwait "$pid"で子の終了を待ちます。終了状態は直後にrc=$?へ保存します。終了シグナルを受けた場合、Bashのwaitは通常128より大きい値を返すので、正常終了0と分けます。
結果と制約を確認する waitの後にpsを再実行し対象が残っていないことを確認します。psで見つからない理由は終了のほか、指定誤りや表示範囲もあるため、保存したPIDと照合します。kill -0は実際の終了シグナルを送らず存在・権限を検査しますが、失敗を存在しないとだけ解釈できません。このラボは自分で起動した子だけを対象にし、全プロセスの一括操作は行いません。
図解
重要ポイント
- PIDは実行中の識別子、PPIDは親の識別子。
- 一覧の対象・所有者・時点を確認する。
- シグナル送信成功と終了完了は別。
- TERMによる終了要求、STOP/CONTの一時停止、KILLの強制終了を区別する。
間違えやすい点
- 名前が同じだけで別ユーザーの処理を操作しない。
- ZをKILLで動かない処理のように直そうとしない。
- 古いPIDの再利用と確認後の状態変化に注意する。
用語解説
- PID
- プロセスを識別する番号。終了後に再利用されることがある。
- PPID
- 親プロセスのPID。
- シグナル
- プロセスへ事象や要求を伝える仕組み。
- ゾンビ
- 終了済みだが終了情報が親に回収されていないプロセス状態。
- wait
- シェルが子の終了などを待ち、終了状態を受け取る組込みコマンド。
関連教材
参考資料
教材データに登録された参考リンクです。リンク先の内容や更新日は提供元でご確認ください。
確認問題の出題・採点や学習履歴の保存にはログインが必要です。