psコマンドとawkでPPIDを辿る


『輪廻のラグランジェ』(2012)

1話見ただけでは、ロボットのカッコよさがさっぱり分からないし、ジャージ部魂もよく分からないし、見どころが見つからず、 全然入ってきませんでした。
逆に、面白いところを探すために見る、ってモチベーションが生まれてしまったので、最後まで見るつもりではいます。

linuxではプロセスの輪廻はありません。killしたプロセスが勝手に生まれ変わったりしたら大変。OSの何を信じたら良いのか分かりませんね。親プロセスが子を生成し、親が存在するからこそ、子も存在できるのです。
今回は、親プロセスIDを追っかけます。

まず適当にプロセスを作ります。sleepコマンドを裏で動かします。

takk@deb9:~$ sleep 10000 &

今バックグラウンドで実行したsleepコマンドがpsで表示されるか確認してみましょう。

takk@deb9:~$ ps
  PID TTY          TIME CMD
14801 pts/0    00:00:00 bash
14906 pts/0    00:00:00 sleep
14968 pts/0    00:00:00 ps
takk@deb9:~$ 

次は全プロセスをID付きで表示してみます。

takk@deb9:~$ ps alx
F   UID   PID  PPID PRI  NI    VSZ   RSS WCHAN  STAT TTY        TIME COMMAND
4     0     1     0  20   0 204764  7064 -      Ss   ?          0:07 /sbin/init
1     0     2     0  20   0      0     0 -      S    ?          0:00 [kthreadd]
1     0     3     2  20   0      0     0 -      S    ?          0:05 [ksoftirqd/

省略

1     0 14899     2  20   0      0     0 -      S    ?          0:00 [kworker/u2
0  1000 14906 14801  20   0   5320   676 -      S    pts/0      0:00 sleep 10000
1     0 14951     2  20   0      0     0 -      S    ?          0:00 [kworker/0:
1     0 14967     2  20   0      0     0 -      S    ?          0:00 [kworker/0:
0  1000 14970 14801  20   0  29344  1620 -      R+   pts/0      0:00 ps alx
0  1000 17128  1396  20   0 831376 129404 SyS_po Sl  ?          1:51 /usr/bin/pe
5     0 29539     1  20   0 272872 29120 -      Ss   ?          0:16 /usr/sbin/a
4   118 31869     1  20   0 325584 61828 -      Ssl  ?         10:29 /usr/bin/mo
takk@deb9:~$ 

3列目がPID(プロセスID)、4列目がPPID(親プロセスのID)です。

awkでフィルタリングします。

takk@deb9:~$ ps alx | awk '{print "pid=",$3,"ppid=",$4}'
pid= PID ppid= PPID
pid= 1 ppid= 0
pid= 2 ppid= 0
pid= 3 ppid= 2

省略

pid= 15168 ppid= 14801
pid= 17128 ppid= 1396
pid= 29539 ppid= 1
pid= 31869 ppid= 1
takk@deb9:~$ 

awkの連想配列を使って、親プロセスを辿ってみましょう。すべての親は1番なので、1番になるまで繰り返しする処理です。

takk@deb9:~$ cat -n findfather.sh
     1	#!/bin/bash
     2	ps alx | awk '
     3	{
     4		parent[$3]=$4
     5	}
     6	
     7	END{
     8		pid=14906
     9		while(pid != 1){
    10			pid=parent[pid]
    11			printf("-> %d", pid)
    12		}
    13		print ""
    14	}
    15	'
takk@deb9:~$ 

Leave a Reply

Your email address will not be published. Required fields are marked *

CAPTCHA