Tl; dr:
sleepログアウトしてターミナルを閉じてもプロセスが存続するのはなぜですか?私の考えでは、デーモンとnohupプログラム以外のすべてはログアウト中に強制終了されます。sleepこの方法で生き残ることができる場合、nohupコマンドの代わりにこの方法を使用できるということですか?
bashによって生成されたインスタンスにオプションが設定されsshていない限り、huponexitプロセスは終了/ログアウト時に決して終了しません。huponexitオプションが設定されている場合、シェルでのkill -9使用nohupはシェルの子プロセスでの使用に代わる適切な方法ではありません。nohupシェルの子プロセスでは、シェルからのSIGHUPからプロセスを保護します。それが重要nohupでない場合でも、シェルを正常に終了できるため、これを優先することをお勧めします。
bash呼ばれるオプションがありますhuponexitセットが作れば、bashSIGHUP終了/ログアウト時にその子は、
によって生成されたインスタンスなどのインタラクティブな非ログイン bashインスタンスでは、このオプションは無視されます。が設定されているかどうかにかかわらず、終了時にの子がSIGHUPされることはありません。bashgnome-terminalhuponexitbashbash
によって生成されたインスタンスなどの対話型ログイン bashインスタンスでは、このオプションは無視されません(ただし、デフォルトでは設定されていません)。が設定されている場合、の子は、終了/ログアウト時にSIGHUPされます。場合は設定されていない、の子供たちがでSIGHUPpedされることはありません終了/ログアウト時。bashsshhuponexitbashbashhuponexitbashbash
したがって、一般に、対話型ログインbashインスタンスからの終了/ログアウトhuponexitは、オプションが設定されていない限り、シェルを子にSIGHUPせず、対話型非ログインbashインスタンスから終了/ログアウトしても、シェルを子にSIGHUPしません関係なく;
ただし、これはこの場合は無関係です。kill -9 sleep親プロセス(bash)を強制終了しても、後者が前者に何かをする機会がなくなるため(たとえば、現在のbashインスタンスがログインbashインスタンスである場合)、およびhuponexitオプション)は、それをSIGHUPし、設定しました。
これに加えて、他のシグナル(に送信されるSIGHUPシグナルなど)とは異なりbash、SIGKILLシグナルはプロセスの子プロセスに伝播されないため、強制終了されることsleepさえありません。
nohupSIGHUPシグナルの影響を受けないプロセスを開始します。これは別のものです。これは、SIGHUPシグナルの受信時にプロセスがハングアップするのを防ぎます。SIGHUPシグナルは、このbash場合、huponexitオプションが設定されてシェルが終了した場合に、インタラクティブログインインスタンスによって受信されます。したがって、技術的には、オプションが設定されていないnohup対話型ログインbashインスタンスでプロセスを開始するために使用するhuponexitと、SIGHUPシグナルの受信時にプロセスがハングアップするのを防ぐことができます。
ただし、一般に、nohupSIGHUPシグナルが親シェルから送信されるのを防ぐ必要がある場合は、子メソッドよりkill -9親メソッドのほうを優先する理由はありませんnohup。代わりに、それは逆になります。
使用親死滅kill -9使用子の起動中の方法は、親が正常に終了するための機会を残さないnohup方法と、親コンテキストで意味をなす例を作るようSIGHUPなどの他の信号、(によって終了されることを可能にしますの使用を開始した子のnohup)により、正常に終了できます。
&プロセスを(デーモンのように)バックグラウンドにフォークし、ログアウトしている場合でも実行を継続します。