nohupとampersandの違いは何ですか


242

両方nohup myprocess.out &またはmyprocess.out &myprocess.outをバックグラウンドで実行するように設定します。端末をシャットダウンした後、プロセスはまだ実行中です。それらの違いは何ですか?


どのシェルを使用していますか?動作はシェルによって異なります
shx2 2013年

1
バッシュ。そして、なぜ今@nemoの答えに従っているかを知っています。
Yarkee 2013年

@Yarkee回答が問題に適している場合は、質問を承認済みとしてマークして(回答の投票の下のチェックボックス)、未回答とならないようにしてください。あなたはすべての質問のためにそうするべきです:)
nemo

1
shutdown特定のLinuxの意味を持つ用語としては避け、で置き換える必要がありexitます。
Patrizio Bertoni 2014

回答:


316

nohupman 7 signalアンパサンドはキャッチしませんが、ハングアップシグナル(を参照)をキャッチします(シェルがそのように構成されているか、送信しない場合を除く)。SIGHUPを除く)。

通常、&後でシェルを使用してコマンドを実行し、シェルを終了すると、シェルはハングアップ信号(kill -SIGHUP <pid>)でサブコマンドを終了します。これはnohup、信号をキャッチして無視するため、実際のアプリケーションに到達しないため、を使用して防止できます。

bashを使用している場合は、コマンドshopt | grep huponを使用して、シェルがSIGHUPを子プロセスに送信するかどうかを確認できます。オフになっていると、プロセスが終了することはありません。bashがアプリケーションを終了する方法の詳細については、こちらを参照してください

ここでnohupそうであるように、開始したプロセスがSIGHUP信号を再接続するときなど、機能しないケースがあります


&サブコマンドが一部のシグナル(SIGINTなど)を受信しない原因になることに注意してください。nohup本質的にSIGHUP伝播されない信号のリストに追加します。
studgeek

46

myprocess.out &サブシェルを使用してバックグラウンドでプロセスを実行します。現在のシェルが(たとえば、ログアウトによって)終了すると、すべてのサブシェルも終了するため、バックグラウンドプロセスも終了します。nohupはのコマンドは無視されHUP、現在のシェルは、サブシェルを終了し、場合でも、これを信号とmyprocess.outバックグラウンドで実行し続けることになります。もう1つの違いは、&単独ではstdout / stderrをリダイレクトしないため、出力やエラーがある場合は、それらが端末に表示されることです。一方、nohupはstdout / stderrをnohup.outまたはにリダイレクトし$HOME/nohup.outます。


6
myprocess.out &シェルを実行して終了します。ただし、ps aux | grep myprocess.out他のシェルで使用した場合でも、「myprocess.out」が見つかります。これは、プロセスがまだ実行中であることを意味し、終了されません。
Yarkee 2013年

1
@amit_g親シェルを強制終了するkill -9と、SIGHUPはありません。これは、親シェルがSIGKILLを処理する必要があるためでなく、処理できないためです。
nemo 2013年

2
ショップをチェック| 他の回答で述べたように、grep hupon。
amit_g 2013年

31

ほとんどの場合、sshを使用してリモートサーバーにログインします。シェルスクリプトを起動してログアウトすると、プロセスが強制終了されます。Nohupは、シェルからログアウトした後でも、スクリプトをバックグラウンドで実行し続けるのに役立ちます。

Nohup command name &
eg: nohup sh script.sh &

NohupはHUPシグナルをキャッチします。Nohupはジョブをバックグラウンドで自動的に実行しません。&を明示的に使用することを伝える必要があります


ありがとう。あなたの答えを期待していませんでしたが、ここにあるという事実は素晴らしいです。それは私が尋ねなかった質問に答えます:D
Vaibhav Kaushal

26

アンパサンド(&)を使用すると、子プロセス(現在のbashセッションの子)でコマンドが実行されます。ただし、セッションを終了すると、すべての子プロセスが強制終了されます。

nohup +アンパサンド(&)を使用しても同じことが行われますが、セッションが終了すると、子プロセスの親が「init」プロセスである「1」に変更され、子が強制終了されないようにします。


7

私が間違っていたら訂正してください

  nohup myprocess.out &

nohupはハングアップシグナルをキャッチします。つまり、ターミナルが閉じたときにプロセスが送信されます。

 myprocess.out &

プロセスは実行できますが、ターミナルを閉じると停止します。

nohup myprocess.out

端末を閉じても実行できるプロセスですが、端末でctrl+ zを押すとプロセスを停止できます。Crt+ が存在するz場合&は機能しません。


2

nohupコマンドはシグナルマスキングユーティリティであり、ハングアップシグナルをキャッチします。アンパサンドがハングアップ信号をキャッチしないので。&を使用してコマンドを実行し、シェルを終了すると、シェルはサブコマンドをハングアップ信号で終了します。nohupはシグナルをキャッチするので、これを防ぐことができます。Nohupコマンドは、カーネルによってプロセスに送信されるハングアップ信号を受け入れ、それらをブロックします。Nohupコマンドは、ユーザーが長時間実行されているアプリケーションをログアウトしたり、プロセスが開始されたウィンドウを閉じたりする場合に役立ちます。これらのアクションのいずれかは通常、アプリケーションでハングアップするようにカーネルに促しますが、nohupラッパーによりプロセスを続行できます。アンパサンドを使用すると、子プロセスと現在のbashセッションのこの子でコマンドが実行されます。セッションを終了すると、そのプロセスのすべての子プロセスが強制終了されます。アンパサンドは、アクティブなシェルのジョブ制御に関連しています。これは、バックグラウンドのセッションでプロセスを実行する場合に役立ちます。


0

環境間のわずかな違いがあなたを悩ますことができる多くの場合があります。これは私が最近出会ったものです。これら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を追加すると、スクリプトが終了し、この動作が両方の環境で一致した場合でも、アプリケーションは実行を続けます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.