シェルスクリプトで親のいなくなったプロセスがinitにぶら下がるのを確認してみる

Thu Jan 2 14:18:06 JST 2014 (modified: Sun Oct 1 10:50:27 JST 2017)
views: 1915, keywords:シェルスクリプト,Linux,PPID,/proc/$$/stat,UNIX/Linuxサーバ この記事は最終更新日が7年以上前のものです。

人に教えなければいけなくてUnderstanding the Linux Kernelという分厚い本をざーっと読んでいます。↓この本です。

んで、親のプロセスが居なくなった子供のプロセスはinitにぶらさがるという記述があったので、読書ばっかりで手を動かすのはいかんとシェルスクリプトで実験してみました。

/proc/$$/stat

親のプロセスはbashだとPPIDという変数で調べられるのですが、どうやら途中で親が変わっても変わらないらしいので、/proc/$$/statというファイルの4列目で調べます。

あ、環境はUbuntu 12.04LTSです。

例えばこういうシェルスクリプトを書きます。$$は自分のプロセスIDで、その下のstatというファイルをcatする単純なものです。

ueda@remote:~/tmp$ cat hoge.bash
   #!/bin/bash
   
   cat /proc/$$/stat

動かす前にシェルのプロセスIDを調べてみましょう。

ueda@remote:~/tmp$ echo $$
   30202

30202です。

ではシェルスクリプトを実行してみます。

ueda@remote:~/tmp$ ./hoge.bash 
   32722 (hoge.bash) S 30202 32722 30202 34816 32722 4202496 437 0 0 0 0 0 0 0 20 0 1 0 465549287 12263424 300 18446744073709551615 4194304 5111460 140734168949024 140734168947600 140156932455566 0 65536 4 65538 18446744071579287524 0 0 17 1 0 0 0 0 0

4列目に30202がいます。

では実験

次のような二つのシェルスクリプトを準備します。parent.bashはchild.bashを立ち上げた後、5秒後に終わっちまいます。一方、child.bashは1秒置きに自分のプロセスのstatファイルを監視します。本に書いている通りなら5秒後に親のプロセスIDがinitの1に変化するはずです。

ueda@remote:~/tmp$ cat parent.bash 
   #!/bin/bash
   
   echo PARENT_ID: $$
   ./child.bash &
   
   sleep 5
   ueda@remote:~/tmp$ cat child.bash 
   #!/bin/bash
   
   for n in {1..10} ; do
       awk '{print $4}' /proc/$$/stat
       sleep 1
   done

実行!

ueda@remote:~/tmp$ ./parent.bash 
   PARENT_ID: 619
   619
   619
   619
   619
   619
   ueda@remote:~/tmp$ 1 <- parent.bashが終わる
   1
   1
   1
   1
   
   ueda@remote:~/tmp$ 

うまくいった!!!!

・・・だから何だという気もしないでもないが。

あと数日であと850ページくらいを読み、だいたいどこに何が書いてあるか頭に詰め込まなければならぬ。死ぬ。

おしまい。

ノート   このエントリーをはてなブックマークに追加 
 

prev:喪中です。 next:CSVをスペース区切りに変換するコマンド

やり散らかし一覧

記事いろいろ