両方nohup myprocess.out &
またはmyprocess.out &
myprocess.outをバックグラウンドで実行するように設定します。端末をシャットダウンした後、プロセスはまだ実行中です。それらの違いは何ですか?
shutdown
特定のLinuxの意味を持つ用語としては避け、で置き換える必要がありexit
ます。
両方nohup myprocess.out &
またはmyprocess.out &
myprocess.outをバックグラウンドで実行するように設定します。端末をシャットダウンした後、プロセスはまだ実行中です。それらの違いは何ですか?
shutdown
特定のLinuxの意味を持つ用語としては避け、で置き換える必要がありexit
ます。
回答:
nohup
man 7 signal
アンパサンドはキャッチしませんが、ハングアップシグナル(を参照)をキャッチします(シェルがそのように構成されているか、送信しない場合を除く)。SIGHUP
を除く)。
通常、&
後でシェルを使用してコマンドを実行し、シェルを終了すると、シェルはハングアップ信号(kill -SIGHUP <pid>
)でサブコマンドを終了します。これはnohup
、信号をキャッチして無視するため、実際のアプリケーションに到達しないため、を使用して防止できます。
bashを使用している場合は、コマンドshopt | grep hupon
を使用して、シェルがSIGHUPを子プロセスに送信するかどうかを確認できます。オフになっていると、プロセスが終了することはありません。bashがアプリケーションを終了する方法の詳細については、こちらを参照してください。
ここでnohup
そうであるように、開始したプロセスがSIGHUP
信号を再接続するときなど、機能しないケースがあります。
&
サブコマンドが一部のシグナル(SIGINTなど)を受信しない原因になることに注意してください。nohup
本質的にSIGHUP
伝播されない信号のリストに追加します。
myprocess.out &
サブシェルを使用してバックグラウンドでプロセスを実行します。現在のシェルが(たとえば、ログアウトによって)終了すると、すべてのサブシェルも終了するため、バックグラウンドプロセスも終了します。nohupはのコマンドは無視されHUP
、現在のシェルは、サブシェルを終了し、場合でも、これを信号とmyprocess.out
バックグラウンドで実行し続けることになります。もう1つの違いは、&
単独ではstdout / stderrをリダイレクトしないため、出力やエラーがある場合は、それらが端末に表示されることです。一方、nohupはstdout / stderrをnohup.out
またはにリダイレクトし$HOME/nohup.out
ます。
myprocess.out &
シェルを実行して終了します。ただし、ps aux | grep myprocess.out
他のシェルで使用した場合でも、「myprocess.out」が見つかります。これは、プロセスがまだ実行中であることを意味し、終了されません。
kill -9
と、SIGHUPはありません。これは、親シェルがSIGKILLを処理する必要があるためでなく、処理できないためです。
ほとんどの場合、sshを使用してリモートサーバーにログインします。シェルスクリプトを起動してログアウトすると、プロセスが強制終了されます。Nohupは、シェルからログアウトした後でも、スクリプトをバックグラウンドで実行し続けるのに役立ちます。
Nohup command name &
eg: nohup sh script.sh &
NohupはHUPシグナルをキャッチします。Nohupはジョブをバックグラウンドで自動的に実行しません。&を明示的に使用することを伝える必要があります
nohupコマンドはシグナルマスキングユーティリティであり、ハングアップシグナルをキャッチします。アンパサンドがハングアップ信号をキャッチしないので。&を使用してコマンドを実行し、シェルを終了すると、シェルはサブコマンドをハングアップ信号で終了します。nohupはシグナルをキャッチするので、これを防ぐことができます。Nohupコマンドは、カーネルによってプロセスに送信されるハングアップ信号を受け入れ、それらをブロックします。Nohupコマンドは、ユーザーが長時間実行されているアプリケーションをログアウトしたり、プロセスが開始されたウィンドウを閉じたりする場合に役立ちます。これらのアクションのいずれかは通常、アプリケーションでハングアップするようにカーネルに促しますが、nohupラッパーによりプロセスを続行できます。アンパサンドを使用すると、子プロセスと現在のbashセッションのこの子でコマンドが実行されます。セッションを終了すると、そのプロセスのすべての子プロセスが強制終了されます。アンパサンドは、アクティブなシェルのジョブ制御に関連しています。これは、バックグラウンドのセッションでプロセスを実行する場合に役立ちます。
環境間のわずかな違いがあなたを悩ますことができる多くの場合があります。これは私が最近出会ったものです。これら2つのコマンドの違いは何ですか?
1 ~ $ nohup myprocess.out &
2 ~ $ myprocess.out &
答えはいつもと同じです-それは異なります。
nohupはハングアップシグナルをキャッチしますが、アンパサンドはキャッチしません。
ハングアップ信号とは何ですか?
SIGHUP-制御端末でのハングアップまたは制御プロセスの終了が検出されました(値:1)。
通常、&を使用してコマンドを実行し、その後シェルを終了すると、シェルはハングアップ信号(kill -SIGHUP $ PIDなど)でサブコマンドを終了します。これはnohupを使用して防止できます。これは、信号をキャッチして無視するため、実際のアプリケーションに到達しないためです。
結構ですが、この場合のように、常に「buts」があります。シェルがSIGHUPをまったく送信しないように構成されている場合、これらの起動方法に違いはありません。
bashを使用している場合、以下に指定するコマンドを使用して、シェルがSIGHUPを子プロセスに送信するかどうかを確認できます。
~ $ shopt | grep hupon
また、nohupが機能しない場合もあります。たとえば、開始したプロセスがNOHUP信号を再接続すると(アプリケーションコードレベルで、内部で行われます)。
説明されているケースでは、カスタムサービス起動スクリプト内でnohupコマンドを使用せずに適切なアプリケーションを設定して起動する2番目のスクリプトが呼び出されたときに、違いがないことに気が付きました。
1つのLinux環境ではすべてがスムーズに動作し、2番目の環境では2番目のスクリプトが終了するとすぐにアプリケーションが終了しました(そのようなケースを検出すると、もちろん、:stuck_out_tongue:と思うかもしれません)。
2番目のスクリプトに起動方法としてnohupを追加すると、スクリプトが終了し、この動作が両方の環境で一致した場合でも、アプリケーションは実行を続けます。