
私はnohup
バイナリファイルとしてどんなシェルでもアクセスできることを知っています。ただし、exec
組み込み機能はどのシェルにも存在できます。
他のものより1つを選ぶ理由はありますか?
答え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
a を受信するとプロセスは終了しますが、nohup
プロセスは続行されます。
答え3
シェル組み込みコマンドはexec <command>
シェルに置き換え、<command>
新しいプロセスはなく、新しいPIDは生成されません。通常、端末は完了すると<command>
閉じます。バックグラウンドで実行すると、最初にサブシェルが作成され、同様にすぐに<command>
。
コマンドはnohup <command>
実行されます<command>
が停止しないため(kill -s 1)、コマンドを開始したターミナルシェルが閉じても終了しません。まず、バックグラウンドで実行してサブシェルを作成し、コマンドをバックグラウンドで実行してプロンプトに戻ります。
スクリプトでは、即時の効果はほぼ同じで、<command>
スクリプトによって開始され、スクリプトは<command>
開始、出力転送、または完了を待たずに続行されます。
答え4
nohup
をexec
使用して実行可能ファイルを実行するnohup
と、nohup
これをnice
行うことはできません。通常、このHUP
信号は問題のプロセスにログアウトを警告する端末の方法です。