web-dev-qa-db-ja.com

Nohupとampersandの違いは何ですか

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

213
Yarkee

Nohupはハングアップシグナル(man 7 signalを参照)を捕捉しますが、アンパーサンドは捕捉しません(Shellがそのように構成されているか、またはSIGHUPをまったく送信しない場合を除く)。

通常、&を使用してコマンドを実行し、その後シェルを終了すると、シェルはハングアップシグナル(kill -SIGHUP <pid>)でサブコマンドを終了します。これはNohupを使って防ぐことができます、なぜならそれは実際のアプリケーションに決して届かないようにシグナルをキャッチして無視するからです。

Bashを使用している場合は、シェルが子プロセスにSIGHUPを送信しているかどうかを調べるために、コマンドshopt | grep huponを使用できます。オフになっていると、プロセスが終了することはありません。これは、あなたに当てはまるようです。 bashがアプリケーションをどのように終了させるかについてのより多くの情報はここで見つけることができます。

ここで のように、開始したプロセスがNohupシグナルを再接続する場合など、SIGHUPが機能しない場合があります

282
nemo

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

33
amit_g

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

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

NohupはHUPシグナルを受け取ります。 Nohupは自動的に仕事をバックグラウンドにしません。 &を使って明示的に伝える必要があります

22
missgeorge

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

nohup +アンパサンド(&)を使用しても同じことができますが、セッションが終了したときに子プロセスの親が "1"に変更されるため、 "init"プロセスになります。

21
Michel

間違っていれば訂正してください

  Nohup myprocess.out &

Nohupハングアップシグナルを捕捉します。これは端末が閉じたときにプロセスを送信することを意味します。

 myprocess.out &

プロセスは実行できますが、端末が閉じられると停止します。

Nohup myprocess.out

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

5
John Joe

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

1
santosh