シェルスクリプトで親のいなくなったプロセスがinitにぶら下がるのを確認してみる
Thu Jan 2 14:18:06 JST 2014 (modified: Sun Oct 1 10:50:27 JST 2017)
views: 2055, 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ページくらいを読み、だいたいどこに何が書いてあるか頭に詰め込まなければならぬ。死ぬ。
おしまい。