web-dev-qa-db-ja.com

どうすれば親プロセスのみを強制終了できますか?

私は以下のプロセスを持っています。

 ParentProcess 
-ChildProcess 
-ChildProcess 
-ChildProcess 

どうすれば親プロセスのみを強制終了できますか?子供のプロセスが殺されないようにしたい。親プロセスを強制終了しようとすると、子はSIGHUPを取得し、強制終了されます。

10
kcm1700

一般的に、プロセスが孤立する(つまり、その親が死ぬ)と、initによって採用されます。

あなたが説明する特別な状況は、おそらくその制御端末が閉じるときの対話型プロセスに当てはまります( Wikipedia から):

SIGHUP信号は、制御端末が閉じているときにプロセスに送信されます。もともとは、シリアルラインのドロップをプロセスに通知するために設計されました。最近のシステムでは、この信号は通常、疑似端末または仮想端末の制御が閉じられていることを意味します。

これを防ぐには、子プロセスがSIGHUPをブロックする必要があるため、ほとんどの場合、親プロセスからの協力が必要です。

親プロセスがシェル(bashcshなど)であり、実行したコマンドがbashの終了時に終了しないようにする場合は、任意のコマンドの前にNohupを付けることができます。 (info coreutils "Nohup invocation"から):

「Nohup」は、ハングアップ信号を無視して指定されたコマンドを実行するため、ログアウト後もコマンドをバックグラウンドで実行し続けることができます。

この例では:

$ tty
/dev/ttys000
$ Nohup find /dir -name file -exec rm {} \;

findは、シェルが終了して制御端末/dev/ttys000を閉じても強制終了されません。

シェルスクリプトがSIGHUPをブロックする必要がある場合は、説明されているように、組み込みのtrapを使用します here for bash

8
jaume