nohup
バイナリなので、どのシェルからでもアクセスできることはわかっています。ただしexec
、組み込みはおそらくすべてのシェルに存在します。
どちらか一方を他方より好む理由はあるでしょうか?
答え1
魚と自転車、どちらがいいでしょうか?いろいろなことをしてみnohup
ましょexec
う。
exec
は、シェルを別のプログラムに置き換えます。exec
単純なバックグラウンド ジョブで を使用することは有用ではありません。 は、exec myprogram; more stuff
シェルを に置き換え、 が終了したときにが実行されるのとは異なり、myprogram
は実行されません。ただし、 はバックグラウンドで起動し、と同様にを実行します。more stuff
myprogram; more stuff
more stuff
myprogram
exec myprogram & more stuff
myprogram
more stuff
myprogram & more stuff
nohup
SIGHUP シグナルを無視して指定されたプログラムを実行します。端末が閉じられると、カーネルはその端末の制御プロセス (つまりシェル) に 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
シグナルは、慣例により、ターミナルが依存プロセスにログアウトを警告する方法です。