「exec&」の代わりに「nohup&」を使用する理由

「exec&」の代わりに「nohup&」を使用する理由

私はnohupバイナリファイルとしてどんなシェルでもアクセスできることを知っています。ただし、exec組み込み機能はどのシェルにも存在できます。

他のものより1つを選ぶ理由はありますか?

答え1

魚と自転車のどちらが良いですか?nohupそしてexec別のことをしてみてください。

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

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

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

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

答え2

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

nohup=>すべてのSIGHUP(終了信号)を避け、端末が閉じていても実行し続けます。

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

答え3

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

コマンドはnohup <command> 実行されます<command>が停止しないため(kill -s 1)、コマンドを開始したターミナルシェルが閉じても終了しません。まず、バックグラウンドで実行してサブシェルを作成し、コマンドをバックグラウンドで実行してプロンプトに戻ります。

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

答え4

nohupexec使用して実行可能ファイルを実行するnohupと、nohupこれをnice行うことはできません。通常、このHUP信号は問題のプロセスにログアウトを警告する端末の方法です。

関連情報