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

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

nohupバイナリなので、どのシェルからでもアクセスできることはわかっています。ただしexec、組み込みはおそらくすべてのシェルに存在します。

どちらか一方を他方より好む理由はあるでしょうか?

答え1

魚と自転車、どちらがいいでしょうか?いろいろなことをしてみnohupましょexecう。

execは、シェルを別のプログラムに置き換えます。exec単純なバックグラウンド ジョブで を使用することは有用ではありません。 は、exec myprogram; more stuffシェルを に置き換え、 が終了したときにが実行されるのとは異なり、myprogramは実行されません。ただし、 はバックグラウンドで起動し、と同様にを実行します。more stuffmyprogram; more stuffmore stuffmyprogramexec myprogram & more stuffmyprogrammore stuffmyprogram & more stuff

nohupSIGHUP シグナルを無視して指定されたプログラムを実行します。端末が閉じられると、カーネルはその端末の制御プロセス (つまりシェル) に SIGHUP を送信します。次にシェルはバックグラウンドで実行されているすべてのジョブに SIGHUP を送信します。 でジョブを実行するnohupと、端末が停止した場合にジョブが強制終了されるのを防ぐことができます (これは、たとえばリモートでログインしていて接続が切断された場合や、端末エミュレータを閉じた場合に発生します)。

nohupまた、プログラムの出力をファイルにリダイレクトしますnohup.out。これにより、出力やエラー出力に書き込むことができないためにプログラムが終了してしまうのを回避できます。nohup入力はリダイレクトされないことに注意してください。プログラムを起動した端末から完全に切断するには、

nohup myprogram </dev/null >myprogram.log 2>&1 &

答え2

exec &=> プロセスをバックグラウンド プロセスとして実行するので、同じ端末を他のジョブに引き続き使用できます。

nohup=> すべての SIGHUP (終了シグナル) を回避し、ターミナルが閉じられても実行を継続します。

execを受信するとプロセスは終了しますSIGHUPが、nohupプロセスは継続されます。

答え3

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

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

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

答え4

nohupと比較することはできませんexec。 で実行ファイルを実行するとnohup、ログアウトしてもプロセスは終了しません(sshセッション)。 は通常、nohupで使用されnice、プロセスを低い優先度で実行します。HUPシグナルは、慣例により、ターミナルが依存プロセスにログアウトを警告する方法です。

関連情報