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


67

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

どちらかを好む理由はありますか?

回答:


113

魚と自転車のどちらがいいですか?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 &

27
自転車>魚
クリスジェーンズ

6
失礼ですが同意できません。魚は、実装できるのであれば、明らかに優れた輸送手段です。
このユーザーはヘルプを必要とします

6
@THISUSERNEEDSHELPしかし、自転車は確かに良い食べ物ですか?
ジル 'SO-悪であるのをやめる'

3
@GypsyCosmonaut実行後exec firefox、シェルは実行されなくなりましたfirefox。シェルはに置き換えられました。execプログラムの終了と新しいプログラムの開始を組み合わせて、同じプロセスIDを維持すると考えることができます。停止するように指示されたものがないため、端末は実行を続けます。後でFirefoxをfirefox終了すると、プロセスは終了します。端末は、その子プロセスが終了したことに気づくため、順番に終了します。
ジル 'SO-悪であるのをやめる'

5
男に魚を与え、あなたは一日彼を養います。男に自転車を渡せば、彼はそれをスーパーに乗せて一生魚を買うことができます。
デビッド

18

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

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

execプロセスは、ときに死亡SIGHUP受信されるが、nohupプロセスは継続します。


1
この答えは正しいようです。上記の他の回答が言っているように、通常execは実行中のプロセスを置き換えますが&、exec'dコマンドをバックグラウンドで使用する場合は発生しないようです。bashでもzshでもない。
ダンプリッツ16

@DanPrittsそれが起こらないとはどういう意味ですか?バックグラウンドサブプロセスが開始されてから置換されるためexec smth &、と同じになり(exec smth) &ますか?
phk

1
つまり、通常考えている(現在実行中のシェルを置き換える)意味でexecされません-バックグラウンドプロセスとして実行されるだけです。たぶんそれと同じだと思い(exec smth) &ます。しかし、私はそれが同じであることを期待しません-私はそれが構文エラーであると期待します、どのようにプロセスを実行して(自分自身を置き換えて)、exec'dプロセスをバックグラウンドにできますか?あなたはもうそれをするためにそこにいません。
ダンプリッツ

2

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

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

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


私もexecが何をするのかわかりません。私が意味する...私はそれを行うことになっているものを理解するが、私はやっ間のわずかな違いを確認できscript.sh &たりしますexec script.sh &。どちらの場合も、コマンドは子プロセスで実行され、呼び出しプロセスを置き換えません。paste.alacon.org / 44474を参照してください(コメントでコピーするには長すぎます...)。私は何を間違えていますか?
ステファン

2

あなたは比較することはできませんnohupexec。で実行可能ファイルを実行するとnohup、ログアウト(sshセッション)時にプロセスは強制終了されません。通常、低優先度でプロセスを実行するnohupために使用niceされます。HUP信号は、慣例により、端末がログアウトの依存プロセスを警告する方法です

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.