- ベストアンサー
死なない(不思議な?)プロセスの振舞いについて
プロセスの振舞いでよく分からない点がありますので、 この点に詳しい方、ぜひご教授下さい。 実験として、次のような無限ループをもつシェルスクリプトを作りました。 #!/bin/sh while : do echo "hogehoge" > tmp echo "Please stop me!" sleep 1 done このfile名を loop.sh として、実行属性を付けてから $ ./loop.sh & とバックグラウンドで実行してみます。 すると、1秒毎に、tmpにhogehogeと書き込まれ 標準出力にPlease stop me!と標準出力に表示されますが、 ここで、 exitコマンドでterminalを急に閉じてみます。 こうした場合、どうやら、このプロセスは何処かで生き続けるようなのです。 というのも、新たにterminalを起動し、上で出来た tmp をrmで消そうとしても、 すぐ新たなtmpが作られるからです。 しかも、単にlogoutしただけではこのプロセスは死なないようです。 (再起動するとさすがに止まります。) そこで質問ですが、 1) 上のプロセスが生き続けていることを確認する方法はありますか? 2) この生き続けたプロセスを再起動せずに殺す方法はありますか? 3) このようにシェルスクリプト実行中に急にexitをされた場合でも、 スクリプトが正常終了するように予めスクリプトを組むことは出来ますか? 以上3点についてご教授いただけたら幸です。 よろしくお願いします。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
バックグラウンドプロセスはログアウト時に終了させないのがLinuxの仕様みたいですよ。参考URLの一番下に書いてあります。 3についてはtrapを使ってシグナル処理を行うことです。 バックグラウンドで動かしている時にログアウトを検知して終了させたいということであれば、定期的にログイン中のユーザーをチェックさせればよいと思います。
その他の回答 (3)
- komugi100g
- ベストアンサー率58% (108/186)
おはよう。 3)わざわざ割り込みを手動で投げてtrapさせるのが億劫な場合は 呼び出し元のプロセスIDが$PPIDに入ってるんで ループの中のどこかに test `ps | awk '{print $1}' | grep $PPID` || 終了るーちん または exit みたいな処理を入れてみたらどうかな。 PPIDのプロセスがなくなってたら云々という意味です。
お礼
なるほど~こういう手もあるのですね。 この方法で起動された側で自律的に終了させることができました。 呼び出し元のプロセスIDが$PPIDに入ってるってのも初めて知りました。 この手法は応用が効きそうですね。 勉強になりました。ありがとうございました。
- BLUEPIXY
- ベストアンサー率50% (3003/5914)
ps ax して、プロセスIDーを調べて kill IDNo 3)は、わかりません
お礼
No1の方と同様、素早いご回答ありがとうございます。 このオプションでも 1)、2)については解決いたしました。 どうもありがとうございました。
- palmmy
- ベストアンサー率38% (841/2169)
1) ps -ef|grep loop 2) kill -9 プロセスID で駄目かな‥
お礼
素早いご回答ありがとうございます。 お教え頂いた方法で1)、2)については解決いたしました。 どうもありがとうございました。
お礼
>バックグラウンドプロセスはログアウト時に終了させないのがLinuxの仕様みたいですよ。 どうやらそのようですね。初めて知りました。ありがとうございます。 tcshの場合、 バックグラウンドで動かした特定のプロセスをexitに連動して止めたい場合は 起動される側でなく、起動する側で hup loop.sh & のように指定してやればよいようです。 bash の場合はそのようなことができるか否かは不明です。 もしそれが出来ないとすると、スクリプトに trap exit SIGHUP と書いても、そもそもバックグラウンドジョブにシグナルが送られないので 自動的に止めることはできないようです。 起動される側が自律的に終了するには、ご教授いただいたように、 定期的にログイン中のユーザーをチェックする等が必要のようですね。 ありがとうございました