- ベストアンサー
logoutしたとき消えるプロセスは誰が消してるの?
telnetなどでログインして プロセスを動作させて、ログアウトすると 動作させていたプロセスが消えるのですが、 誰がそのプロセスにシグナルを送っているのでしょうか? OSはsolarisを使っています。 シェルが子供を消しているのかと思ったのですが、 以下の動作をみるとそうでないみたいで・・ telnet .... $ $sh $sleep 10000 & 1234(←sleepのPID) $kill [shのPID] $ ps -eo pid,ppid,args | grep 1234 1234 1 sleep 1000 $exit telnet .... $ $ ps -eo pid,ppid,args | grep 1234 $ない
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
> SIGHUPする対象のプロセスはloginと同じPGIDなのでしょうか? SIGHUPは、loginから起動されたshが死んだときに、shと同じPGIDを持つプロセスに送られます。login以外から起動されたshが死んだときは、死にぎわのshが出さないかぎりSIGHUPは出ません。 但し、これは大雑把な説明です。特にジョブ制御が絡む場合など、微妙な点は簡単に説明することが出来ません。OSのリリースによって違います。 下のURLは少し古くなりますがSIGHUPについて少し詳し解説があります。 なお、子が親の死を知りたいのならPPIDを調べるのが素直な方法だと思います。親に新しいプロセスグループやセッションを作らせたりしても、多分、SIGHUPを使うのは無理です。
その他の回答 (4)
- 1Yen
- ベストアンサー率28% (11/39)
> 親が死んだら子も死ぬプログラムが組みたくて ということなので、死ぬのなら勝手に死んでくれと、 生き残ったときのことを考えて、時々 PPID を見て PPID=1 となったとき exit する shell script を 書いた事があります。 # 自分が親なら SIGCHLD が使えそうだが...子どもの時、 # 親の変化はどう捉えればいいのだろうか。
お礼
ありがとうございます。参考になりました。
- furlong
- ベストアンサー率50% (17/34)
誰がシグナルを出しているのか、答えは、ログインシェルが死んだとき、擬似端末ドライバ(カーネル)がSIGHUPを出しています。ログインシェルの道連れになりたくなければnohupを使うか、自分でコードを書く場合はSIGHUPを無視するとか制御端末を切り離すとかすれば良いです。 詳しいことは次のようなキーワードでマニュアルやカーネルソースを漁れば出てきますが深入りしない方が良いでしょう。 controlling terminal controlling process job control ついでに、#2の方が言われているのは端末ドライバとは別にbashが駄目押しで出すSIGHUPのことですが、ジョブ制御が絡むと効いてきます。
補足
ありがとうございます。 ちなみにもし知っていたら、、SIGHUPする対象のプロセスはloginと同じPGIDなのでしょうか? controlling terminalで調べるとPGIDがたくさん出てきたので・・(理解できませんでしたが^^; 何にせよ、ちょっと勉強しないと分からないみたいですね・・
- astronaut
- ベストアンサー率58% (303/516)
シェルが終了する時に sub process をどう扱うかは,間違いなく親シェルの仕事でしょう.実際にどう扱うかはシェルの種類によると思います. Linux の bash では,exit で終了したときには,sub process は生き残り,親シェルが強制終了させられると,sub process も共倒れになるようです.挙動の詳細は man page に書いてあります. sub process を終了させずにシェルを抜けたいというのがご質問の背景にあるのなら,nohup とかが使えませんか?
補足
ありがとうございます。 背景には、 親が死んだら子も死ぬプログラムが組みたくて シェルはどうしてるのかなと思って質問しました。 シェルは場合によっては子が死んだり残ったりするんですね。。 混乱してきた^^;
- akino4
- ベストアンサー率18% (35/185)
SIGHUPを送るのはログインシェルとして実行 したときだけだったような・・・私も憶えてないです。 あと、SIGTERMで終了するときとexitで終了するときで 挙動が違う可能性も十分にあるわけで・・・ 確実にだれがおくったか調べたいならSIGHUPをうける ハンドラをsigactionをつかってSA_SIGINFOフラグをたて siginfo構造体のsi_pidをしらべればいいとおもいます。 POSIX準拠な関数なのでたぶんソラリスにもはいってるはず。 (そういうサンプルプログラムを自分で書くということです)
補足
ありがとうございます。少し調べて作ってみたいと思います。
お礼
ありがとうございます。参考になりました。 2度も解答、どうもありがとうございました。