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