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

プロセスの振舞いでよく分からない点がありますので、
この点に詳しい方、ぜひご教授下さい。

実験として、次のような無限ループをもつシェルスクリプトを作りました。

#!/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点についてご教授いただけたら幸です。
よろしくお願いします。

A 回答 (4件)

バックグラウンドプロセスはログアウト時に終了させないのがLinuxの仕様みたいですよ。

参考URLの一番下に書いてあります。
3についてはtrapを使ってシグナル処理を行うことです。
バックグラウンドで動かしている時にログアウトを検知して終了させたいということであれば、定期的にログイン中のユーザーをチェックさせればよいと思います。

参考URL:http://www.glasscom.com/tone/linux/BasicOperatio …
    • good
    • 0
この回答へのお礼

>バックグラウンドプロセスはログアウト時に終了させないのがLinuxの仕様みたいですよ。

どうやらそのようですね。初めて知りました。ありがとうございます。

tcshの場合、
バックグラウンドで動かした特定のプロセスをexitに連動して止めたい場合は
起動される側でなく、起動する側で
hup loop.sh &
のように指定してやればよいようです。
bash の場合はそのようなことができるか否かは不明です。


もしそれが出来ないとすると、スクリプトに

trap exit SIGHUP

と書いても、そもそもバックグラウンドジョブにシグナルが送られないので
自動的に止めることはできないようです。
起動される側が自律的に終了するには、ご教授いただいたように、
定期的にログイン中のユーザーをチェックする等が必要のようですね。

ありがとうございました

お礼日時:2004/09/23 01:25

おはよう。



3)わざわざ割り込みを手動で投げてtrapさせるのが億劫な場合は
 呼び出し元のプロセスIDが$PPIDに入ってるんで
 ループの中のどこかに

  test `ps | awk '{print $1}' | grep $PPID` || 終了るーちん または exit

 みたいな処理を入れてみたらどうかな。
 PPIDのプロセスがなくなってたら云々という意味です。
    • good
    • 0
この回答へのお礼

なるほど~こういう手もあるのですね。
この方法で起動された側で自律的に終了させることができました。

呼び出し元のプロセスIDが$PPIDに入ってるってのも初めて知りました。
この手法は応用が効きそうですね。
勉強になりました。ありがとうございました。

お礼日時:2004/09/23 01:30

ps ax


して、プロセスIDーを調べて
kill IDNo

3)は、わかりません
    • good
    • 0
この回答へのお礼

No1の方と同様、素早いご回答ありがとうございます。
このオプションでも 1)、2)については解決いたしました。
どうもありがとうございました。

お礼日時:2004/09/23 01:22

1)


ps -ef|grep loop
2)
kill -9 プロセスID

で駄目かな‥
    • good
    • 0
この回答へのお礼

素早いご回答ありがとうございます。
お教え頂いた方法で1)、2)については解決いたしました。
どうもありがとうございました。

お礼日時:2004/09/23 01:22

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