Nohup
はバイナリなので、どのシェルからでもアクセスできます。しかし、exec
ビルトインはおそらくすべてのシェルに存在します。
どちらか一方を他方よりも優先する理由はありますか?
魚や自転車は何がいいの? Nohup
とexec
は異なる働きをします。
exec
は、シェルを別のプログラムに置き換えます。単純なバックグラウンドジョブでexec
を使用しても役に立たない:exec myprogram; more stuff
は、more stuff
とは異なり、シェルをmyprogram
に置き換えて、myprogram; more stuff
を実行しないmyprogram
の終了時にmore stuff
を実行します。ただし、exec myprogram & more stuff
はmore stuff
と同様に、バックグラウンドでmyprogram
を開始してからmyprogram & more stuff
を実行します。
Nohup
SIGHUPシグナルを無視して特定のプログラムを実行します。端末が閉じられると、カーネルはその端末の制御プロセス(つまり、シェル)にSIGHUPを送信します。シェルは、バックグラウンドで実行されているすべてのジョブにSIGHUPを送信します。 Nohup
を使用してジョブを実行すると、ターミナルが停止した場合にこの方法でジョブが強制終了されるのを防ぎます(リモートでログインしていて接続が切断された場合、またはターミナルエミュレーターを閉じた場合など)。
Nohup
は、プログラムの出力をファイルNohup.out
にもリダイレクトします。これにより、プログラムは出力またはエラー出力に書き込むことができないため、プログラムの停止を回避できます。 Nohup
は入力をリダイレクトしないことに注意してください。起動した端末からプログラムを完全に切断するには、次のコマンドを使用します。
Nohup myprogram </dev/null >myprogram.log 2>&1 &
exec &
=>プロセスをバックグラウンドプロセスとして実行するため、他のジョブに同じ端末を引き続き使用できます。
Nohup
=>すべてのSIGHUP(終了信号)を回避し、端末が閉じていても実行を継続します。
exec
プロセスはSIGHUP
を受信すると終了しますが、Nohup
プロセスは続行されます。
Nohup
とexec
を比較することはできません。 Nohup
を指定して実行可能ファイルを実行すると、ログアウト(sshセッション)してもプロセスは強制終了されません。通常、Nohup
はNice
と共に使用され、より低い優先度でプロセスを実行します。 HUP
シグナルは、慣例により、端末がログアウトの依存プロセスに警告する方法です
シェル組み込みコマンドexec <command>
は、シェルを<command>
に置き換えます。新しいプロセスはなく、新しいPIDは作成されません。 <command>
の完了後、通常はターミナルが閉じます。それをバックグラウンドで実行することにより、最初にサブシェルが作成され、次に同様にすぐに<command>
に置き換えられます。
Nohup <command>
コマンドは<command>
を実行しますが、ハングアップ(kill -s 1)は不可能であるため、開始されたターミナルであるシェルが閉じられても終了しません。バックグラウンドで実行すると、最初にサブシェルが作成され、コマンドがバックグラウンドで実行され、プロンプトに戻ります。
スクリプティングの即時効果はほぼ同じですが、<command>
はスクリプトによって開始され、<command>
の開始、出力の送信、または完了を待たずにスクリプトは続行されます。