web-dev-qa-db-ja.com

「exec&」ではなく「nohup&」を使用する理由

Nohupはバイナリなので、どのシェルからでもアクセスできます。しかし、execビルトインはおそらくすべてのシェルに存在します。

どちらか一方を他方よりも優先する理由はありますか?

67
loxaxs

魚や自転車は何がいいの? Nohupexecは異なる働きをします。

execは、シェルを別のプログラムに置き換えます。単純なバックグラウンドジョブでexecを使用しても役に立たない:exec myprogram; more stuffは、more stuffとは異なり、シェルをmyprogramに置き換えて、myprogram; more stuffを実行しないmyprogramの終了時にmore stuffを実行します。ただし、exec myprogram & more stuffmore 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プロセスは続行されます。

18
Ani Menon

Nohupexecを比較することはできません。 Nohupを指定して実行可能ファイルを実行すると、ログアウト(sshセッション)してもプロセスは強制終了されません。通常、NohupNiceと共に使用され、より低い優先度でプロセスを実行します。 HUPシグナルは、慣例により、端末がログアウトの依存プロセスに警告する方法です

2
user2660420

シェル組み込みコマンドexec <command>は、シェルを<command>に置き換えます。新しいプロセスはなく、新しいPIDは作成されません。 <command>の完了後、通常はターミナルが閉じます。それをバックグラウンドで実行することにより、最初にサブシェルが作成され、次に同様にすぐに<command>に置き換えられます。

Nohup <command>コマンドは<command>を実行しますが、ハングアップ(kill -s 1)は不可能であるため、開始されたターミナルであるシェルが閉じられても終了しません。バックグラウンドで実行すると、最初にサブシェルが作成され、コマンドがバックグラウンドで実行され、プロンプトに戻ります。

スクリプティングの即時効果はほぼ同じですが、<command>はスクリプトによって開始され、<command>の開始、出力の送信、または完了を待たずにスクリプトは続行されます。

2
HBruijn