回答:
魚と自転車のどちらがいいですか?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。
nohupSIGHUPシグナルを無視して、特定のプログラムを実行します。端末が閉じられると、カーネルはその端末(シェル)の制御プロセスにSIGHUPを送信します。シェルは、バックグラウンドで実行されているすべてのジョブにSIGHUPを送信します。でジョブを実行するとnohup、端末が死んだ場合(たとえば、リモートでログインして接続が切断された場合、または端末エミュレーターを閉じた場合)、この方法でジョブが強制終了されなくなります。
nohupまた、プログラムの出力をfileにリダイレクトしますnohup.out。これにより、出力またはエラー出力に書き込めないため、プログラムが停止するのを防ぎます。nohup入力をリダイレクトしないことに注意してください。起動した端末からプログラムを完全に切断するには、次を使用します。
nohup myprogram </dev/null >myprogram.log 2>&1 &
exec firefox、シェルは実行されなくなりましたfirefox。シェルはに置き換えられました。execプログラムの終了と新しいプログラムの開始を組み合わせて、同じプロセスIDを維持すると考えることができます。停止するように指示されたものがないため、端末は実行を続けます。後でFirefoxをfirefox終了すると、プロセスは終了します。端末は、その子プロセスが終了したことに気づくため、順番に終了します。
exec & =>プロセスをバックグラウンドプロセスとして実行するため、他のジョブに同じ端末を引き続き使用できます。
nohup =>すべてのSIGHUP(シグナルの終了)を回避し、端末が閉じられていても実行を継続します。
execプロセスは、ときに死亡SIGHUP受信されるが、nohupプロセスは継続します。
execは実行中のプロセスを置き換えますが&、exec'dコマンドをバックグラウンドで使用する場合は発生しないようです。bashでもzshでもない。
exec smth &、と同じになり(exec smth) &ますか?
(exec smth) &ます。しかし、私はそれが同じであることを期待しません-私はそれが構文エラーであると期待します、どのようにプロセスを実行して(自分自身を置き換えて)、exec'dプロセスをバックグラウンドにできますか?あなたはもうそれをするためにそこにいません。
コマンドに組み込まれexec <command>たシェルは、シェルを<command>に置き換え、新しいプロセス、新しいPIDは作成されません。<command>通常の完了後、ターミナルは閉じます。最初にバックグラウンドで実行することにより、サブシェルが作成され、その後同様にすぐに置き換えられ<command>ます。
このnohup <command> コマンドは実行されます<command>が、ハングアップ(kill -s 1)が発生しないため、開始元のターミナルであるシェルが閉じられても終了しません。最初にバックグラウンドで実行すると、サブシェルが作成され、コマンドがバックグラウンドで実行されて、プロンプトに戻ります。
スクリプティングでは、即時効果はほぼ同じですが、<command>スクリプトによって開始され、スクリプトは開始、<command>出力の送信、または完了を待たずに続行します。
script.sh &たりしますexec script.sh &。どちらの場合も、コマンドは子プロセスで実行され、呼び出しプロセスを置き換えません。paste.alacon.org / 44474を参照してください(コメントでコピーするには長すぎます...)。私は何を間違えていますか?
あなたは比較することはできませんnohupとexec。で実行可能ファイルを実行するとnohup、ログアウト(sshセッション)時にプロセスは強制終了されません。通常、低優先度でプロセスを実行するnohupために使用niceされます。HUP信号は、慣例により、端末がログアウトの依存プロセスを警告する方法です