プロが教える店舗&オフィスのセキュリティ対策術

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
$ない

A 回答 (5件)

> SIGHUPする対象のプロセスはloginと同じPGIDなのでしょうか?



SIGHUPは、loginから起動されたshが死んだときに、shと同じPGIDを持つプロセスに送られます。login以外から起動されたshが死んだときは、死にぎわのshが出さないかぎりSIGHUPは出ません。

但し、これは大雑把な説明です。特にジョブ制御が絡む場合など、微妙な点は簡単に説明することが出来ません。OSのリリースによって違います。

下のURLは少し古くなりますがSIGHUPについて少し詳し解説があります。

なお、子が親の死を知りたいのならPPIDを調べるのが素直な方法だと思います。親に新しいプロセスグループやセッションを作らせたりしても、多分、SIGHUPを使うのは無理です。

参考URL:http://www.iem.pw.edu.pl/Archiwum/bsdi-users/018 …
    • good
    • 0
この回答へのお礼

ありがとうございます。参考になりました。
2度も解答、どうもありがとうございました。

お礼日時:2003/06/01 21:45

> 親が死んだら子も死ぬプログラムが組みたくて


ということなので、死ぬのなら勝手に死んでくれと、
生き残ったときのことを考えて、時々 PPID を見て
PPID=1 となったとき exit する shell script を
書いた事があります。
# 自分が親なら SIGCHLD が使えそうだが...子どもの時、
# 親の変化はどう捉えればいいのだろうか。
    • good
    • 0
この回答へのお礼

ありがとうございます。参考になりました。

お礼日時:2003/06/01 21:39

誰がシグナルを出しているのか、答えは、ログインシェルが死んだとき、擬似端末ドライバ(カーネル)がSIGHUPを出しています。

ログインシェルの道連れになりたくなければnohupを使うか、自分でコードを書く場合はSIGHUPを無視するとか制御端末を切り離すとかすれば良いです。

詳しいことは次のようなキーワードでマニュアルやカーネルソースを漁れば出てきますが深入りしない方が良いでしょう。

controlling terminal
controlling process
job control

ついでに、#2の方が言われているのは端末ドライバとは別にbashが駄目押しで出すSIGHUPのことですが、ジョブ制御が絡むと効いてきます。

この回答への補足

ありがとうございます。
ちなみにもし知っていたら、、SIGHUPする対象のプロセスはloginと同じPGIDなのでしょうか?
controlling terminalで調べるとPGIDがたくさん出てきたので・・(理解できませんでしたが^^;
何にせよ、ちょっと勉強しないと分からないみたいですね・・

補足日時:2003/05/31 01:06
    • good
    • 0

シェルが終了する時に sub process をどう扱うかは,間違いなく親シェルの仕事でしょう.実際にどう扱うかはシェルの種類によると思います.



Linux の bash では,exit で終了したときには,sub process は生き残り,親シェルが強制終了させられると,sub process も共倒れになるようです.挙動の詳細は man page に書いてあります.

sub process を終了させずにシェルを抜けたいというのがご質問の背景にあるのなら,nohup とかが使えませんか?

この回答への補足

ありがとうございます。
背景には、
親が死んだら子も死ぬプログラムが組みたくて
シェルはどうしてるのかなと思って質問しました。
シェルは場合によっては子が死んだり残ったりするんですね。。
混乱してきた^^;

補足日時:2003/05/31 01:02
    • good
    • 0

SIGHUPを送るのはログインシェルとして実行


したときだけだったような・・・私も憶えてないです。
あと、SIGTERMで終了するときとexitで終了するときで
挙動が違う可能性も十分にあるわけで・・・

確実にだれがおくったか調べたいならSIGHUPをうける
ハンドラをsigactionをつかってSA_SIGINFOフラグをたて
siginfo構造体のsi_pidをしらべればいいとおもいます。
POSIX準拠な関数なのでたぶんソラリスにもはいってるはず。
(そういうサンプルプログラムを自分で書くということです)

この回答への補足

ありがとうございます。少し調べて作ってみたいと思います。

補足日時:2003/05/31 01:28
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!