SOFTELメモ Developer's blog

会社概要 ブログ 調査依頼 採用情報 ...
技術者募集中

【linux】親プロセスを調べたい

問題

親の顔が見たい じゃなくて、

このプロセスの親プロセスを調べたい。

答え

/proc/[pid]/stat で確認できる。

例えば、apache の子プロセスの場合

# cat /proc/22230/stat
22230 (apache2) S 30384 30384 30384 0 -1 4202816 2960 0 0 0 42 15 0 0 20 0 1 0 4589611100 238653440 3873 18446744073709551615 139915199332352 139915199795212 140728656473808 140728656472744 139915185182695 0 0 4096 201344747 0 0 0 17 0 0 0 0 0 0

4番目のフィールドが親プロセスのIDで30384とある。

ps で確認すると以下のようになっている。

USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
www-data 22230  0.0  0.7 233060 15492 ?        S    22:08   0:00 /usr/sbin/apach ← 子プロセス
root     30384  0.0  0.7 229164 16300 ?        Ss   Sep29   4:13 /usr/sbin/apach ← 親プロセス
No. フィールド scanf 説明
1 pid %d プロセス ID。
2 comm %s 括弧でくくられた実行形式のファイル名。実行形式がスワップアウトされているかどうかによらず、見ることができる。
3 state %c プロセスの状態を示す、以下のいずれか 1 文字。
R 実行中 (Running)
S Sleeping in an interruptible wait
D Waiting in uninterruptible disk sleep
Z ゾンビ (Zombie)
T (シグナルでの) 停止、または (Linux 2.6.33 より前では) トレースによる停止
t トレースによる停止 (Tracing stop) (Linux 2.6.33 以降)
W ページング中 (Linux 2.6.0 より前のみ)
X 死亡 (Dead) (Linux 2.6.0 以降)
x 死亡 (Dead) (Linux 2.6.33 から 3.13 までのみ)
K Wakekill (Linux 2.6.33 から 3.13 までのみ)
W Waking (Linux 2.6.33 から 3.13 までのみ)
P Parked (Linux 3.9 から 3.13 までのみ)
4 ppid %d このプロセスの親プロセスの PID。
5 pgrp %d プロセスのプロセスグループ ID。
6 session %d プロセスのセッション ID。
7 tty_nr %d プロセスの制御端末 (マイナー・デバイス番号はビット 31~20 と 7~0 にまたがって格納され、 メジャー・デバイス番号はビット 15~8 に格納される)。
8 tpgid %d プロセスの制御端末のフォアグランド・プロセス・グループの ID。
9 flags %u プロセスのカーネルフラグワード。 ビットの意味は、 <linux/sched.h> で定義されている PF_* を参照すること。 詳細はカーネルのバージョンに依存する。
10 minflt %lu プロセスが引き起こしたマイナーフォールト (minor fault、ディスクから メモリページへのロードを必要としないフォールト) の回数。
11 cminflt %lu (そのプロセスが終了を待っている) 子プロセスが引き起こしたマイナーフォールトの回数。
12 majflt %lu プロセスが引き起こしたメジャーフォールト (major fault、ディスクからメモリページへのロードを必要とするフォールト) の回数。
13 cmajflt %lu (そのプロセスが終了を待っている) 子プロセスが引き起こしたメジャーフォールトの回数。
14 utime %lu このプロセスがユーザーモードでスケジューリングされた時間の合計。
clock tick 単位で計測される (sysconf(_SC_CLK_TCK) で割った値が表示される)。
この値にはゲスト時間 guest_time (仮想 CPU の実行に消費された時間) も含まれる。これは、ゲスト時間のフィールドを認識しないアプリケーションにおいて、ゲスト時間分を計算に入れ損ねないようにするためである。
15 stime %lu プロセスのカーネルモードでの実行時間 (単位 jiffies)。 このプロセスがカーネルモードでスケジューリングされた時間の合計。
clock tick 単位で計測される (sysconf(_SC_CLK_TCK) で割った値が表示される)。
16 cutime %ld このプロセスの子プロセスで、終了待ち (waited-for) のプロセスが、 ユーザモードでスケジューリングされた時間の合計。
clock tick 単位で計測される (sysconf(_SC_CLK_TCK) で割った値が表示される)。 (times(2) も参照すること。) この値にはゲスト時間 cguest_time (仮想 CPU を実行するのに消費した時間、下記参照) も含まれる。
17 cstime %ld このプロセスの子プロセスで、終了待ち (waited-for) のプロセスが、カーネルモードでスケジューリングされた時間の合計。
clock tick 単位で計測される (sysconf(_SC_CLK_TCK) で割った値が表示される)。
18 priority %ld (Linux 2.6 の場合の説明) リアルタイム・スケジューリングポリシー (下記の policy ; sched_setscheduler(2) 参照) で動作しているプロセスでは、
この 値はスケジューリング優先度を反転した値 (スケジューリング優先度を マイナスにし た値) となる。値は -2 から -100 までの範囲の数値で、 それぞれリアルタイム優先 度の 1 から 9 に対応する。
リアルタイム以外のスケジューリングポリシーで動作し ているプロセスでは、 この値はカーネル内で管理されている nice 値そのもの (setpriority(2)) となる。 カーネルは nice 値を 0 (高) から 39 (低) の範囲 の値として保持しており、 それぞれユーザに見える nice 値の -20 から 19 に対応 する。
Linux 2.6 より前では、このプロセスに割り当てられたスケジューリング 重みを変換した値が表示されていた。
19 nice %ld nice 値 (setpriority(2) 参照)。 19 (最低優先) から -20 (最高優先) の範囲の値である。
20 num_threads %ld このプロセスのスレッド数 (Linux 2.6 以降)。 カーネル 2.6 より前では、このフィールドは削除されたフィールドの 場所埋めとして 0 にハードコードされていた。
21 itrealvalue %ld インターバルタイマによって、次に SIGALRM がプロセスへ送られるまでの時間 (単位 jiffies)。 カーネル 2.6.17 以降では、このフィールドはメンテナンスされなくなり、 0 にハードコードされている。
22 starttime %llu The time the process started after system boot. In kernels before Linux 2.6, this value was expressed in jiffies. Since Linux 2.6, the value is expressed in clock ticks (divide by sysconf(_SC_CLK_TCK)).
23 vsize %lu 仮想メモリのサイズ。単位はバイト。
24 rss %ld Resident Set Size。プロセスが持っている実メモリ上のページ数。 これはちょうどテキスト、データ、スタック空間に使われているページ数である。 デマンドロードされていないページや スワップアウトされたページの数は含んでいない。
25 rsslim %lu このプロセスのrssの現在のソフト・リミット (バイト単位)。 getrlimit(2) の RLIMIT_RSS の説明を参照。
26 startcode %lu プログラムテキストが実行可能であるような領域の先頭アドレス。
27 endcode %lu プログラムテキストが実行可能であるような領域の末尾アドレス。
28 startstack %lu スタックの開始アドレス (すなわち、スタックの底)。
29 kstkesp %lu 現在の ESP (スタックポインタ) の値。 プロセスのカーネルスタックページにある。
30 kstkeip %lu 現在の EIP (インストラクションポインタ) の値。
31 signal %lu 処理待ちのシグナルのビットマップ。 10 進数で表示される。このフィールドは廃止予定である。リアルタイム・シグナルに関する情報は表示されないからである。代わりに /proc/[pid]/status を使うこと。
32 blocked %lu ブロックされた (blocked) シグナルのビットマップ。 10 進数で表示される。 このフィールドは廃止予定である。 リアルタイム・シグナルに関する情報は表示されないからである。 代わりに /proc/[pid]/status を使うこと。
33 sigignore %lu 無視された (ignored) シグナルのビットマップ。 10 進数で表示される。 このフィールドは廃止予定である。 リアルタイム・シグナルに関する情報は表示されないからである。 代わりに /proc/[pid]/status を使うこと。
34 sigcatch %lu 捕捉された (caught) シグナルのビットマップ。 10 進数で表示される。 このフィールドは廃止予定である。 リアルタイム・シグナルに関する情報は表示されないからである。 代わりに /proc/[pid]/status を使うこと。
35 wchan %lu プロセスが待っている「チャネル」。これはシステムコールのアドレスであり、 文字名が必要ならば (アドレスとシステムコール名との) 対応表から見つけられる (もし /etc/psdatabase [訳注: このファイル名はパッケージによる] を更新 しているならば、 ps -l して WCHAN フィールドを見よ)。
36 nswap %lu スワップされたページ数 (メンテナンスされていない)。
37 cnswap %lu 子プロセスの nswap の累計 (メンテナンスされていない)。
38 exit_signal %d プロセスが死んだときに親プロセスに送られるシグナル。
39 processor %d このプロセスを最後に実行した CPU の番号。
40 rt_priority %u リアルタイム・スケジューリングの優先度。 リアルタイム・ポリシーの元でスケジューリングされるプロセスでは 1 から 99 の範囲の値となり、 リアルタイム以外のスケジューリングポリシーのプロセスでは 0 となる (sched_setscheduler(2) 参照)。
41 policy %u スケジューリング・ポリシー (sched_setscheduler(2) 参照)。 値は、linux/sched.h の SCHED_* 定数を使ってデコードすればよい。
42 delayacct_blkio_ticks %llu (clock tick (100分の1秒) 単位での) ブロック I/O の総遅延量。
43 guest_time %lu プロセスのゲスト時間 (ゲスト OS の仮想 CPU を実行するのに消費された時間)。
clock tick 単位で計測される (sysconf(_SC_CLK_TCK) で割った値が表示される)。
44 cguest_time %ld プロセスの子プロセスのゲスト時間。
clock tick 単位で計測される (sysconf(_SC_CLK_TCK) で割った値が表示される)。
45 start_data %lu Address above which program initialized and uninitialized (BSS) data are placed.(Linux 3.3 以降)
46 end_data %lu Address below which program initialized and uninitialized (BSS) data are placed.(Linux 3.3 以降)
47 start_brk %lu Address above which program heap can be expanded with brk(2).(Linux 3.3 以降)
48 arg_start %lu プログラムのコマンドライン引き数 (argv) が置かれる開始アドレス。(Linux 3.5 以降)
49 arg_end %lu プログラムのコマンドライン引き数 (argv) が置かれる終了アドレス。(Linux 3.5 以降)
50 env_start %lu プログラムの環境 (environment) が置かれる開始アドレス。(Linux 3.5 以降)
51 env_end %lu プログラムの環境 (environment) が置かれる終了アドレス。(Linux 3.5 以降)
52 exit_code %d waitpid(2) が報告する形式のスレッドの終了ステータス。(Linux 3.5 以降)

参考

https://lin.osdn.jp/html/LDP_man-pages/man5/proc.5.html

関連するメモ

コメント