の違いは何ですか
$ nohup foo
そして
$ foo &
そして
$ foo &
$ disown
foo &!、最初からそれを否認することと同等であるべきものもあります。
foo & disownすぐに否認する。
setsid、とどのようにそれが関連disownしてnohup
の違いは何ですか
$ nohup foo
そして
$ foo &
そして
$ foo &
$ disown
foo &!、最初からそれを否認することと同等であるべきものもあります。
foo & disownすぐに否認する。
setsid、とどのようにそれが関連disownしてnohup
回答:
最初に、プログラムが(端末に接続された)対話型シェルから&(リダイレクトなしで)起動された場合に何が起こるかを見てみましょう。だからあなたがタイプしたと仮定しましょうfoo:
fooが作成されます。SIGHUPもを送信SIGHUPします(通常、プロセスは終了します)。ここで、プロセスをバックグラウンドに置いた場合、つまり次のように入力した場合にどうなるか見てみましょうfoo &。
fooが作成されます。jobsおり、%n(を使用してアクセスできます)を使用してアクセスできますn。fgこの場合、使用&しないかのように続行します(標準入力から読み取ろうとして停止した場合は、ターミナルからの読み取りに進むことができます)。SIGHUPもを送信SIGHUPします。シェルおよび場合によってはシェルに設定されたオプションに応じて、シェルを終了するときSIGHUPにプロセスにaも送信します。これでdisown、シェルのジョブリストからジョブが削除されるため、上記のすべてのサブポイントは適用されなくなります(SIGHUPシェルから送信されるプロセスを含む)。ただし、まだ端末に接続されていることに注意してください。そのため、端末が破壊されたxterm場合(またはによって作成されたもののようなptyの場合に発生する可能性がありssh、xtermを閉じるかSSH接続を終了することで制御プログラムが終了します) 、プログラムは標準入力からの読み取りまたは標準出力への書き込みを試みるとすぐに失敗します。
nohup一方、何を行うかは、プロセスをターミナルから効果的に分離することです。
EOF)。nohup.outので、ターミナルが失敗してもプログラムは標準出力への書き込みに失敗しないので、プロセスの書き込みは失われません。SIGHUP(したがって名前を)受信するのを防ぎます。注nohupんではないシェルのジョブ制御からプロセスを削除しても、バックグラウンドでそれを入れていません(ただし、フォアグラウンドので、nohupジョブは多かれ少なかれ役に立たない、あなたは一般的に使用してバックグラウンドにそれを置くところ&)。たとえば、とは異なりdisown、シェルはnohupジョブがいつ完了したかを通知します(もちろん、シェルが前に終了しない限り)。
要約すると:
& ジョブをバックグラウンドに配置します。つまり、入力を読み取ろうとするとブロックし、シェルは完了を待機しません。disownシェルのジョブ制御からプロセスを削除しますが、端末に接続したままにします。結果の1つは、シェルがを送信しないことSIGHUPです。フォアグラウンドジョブの実行中は入力できないため、明らかにバックグラウンドジョブにのみ適用できます。nohupプロセスを端末から切断し、その出力をにリダイレクトしnohup.outて、から保護しSIGHUPます。効果の1つ(ネーミングの1つ)は、プロセスが送信されSIGHUPたものを受け取らないことです。これはジョブ制御から完全に独立しており、原則としてフォアグラウンドジョブにも使用できます(ただし、あまり有用ではありません)。disown %1とはdisown -h %1?2番目は、端末が終了するまで通常のジョブとして保持されます(ただし、HUPシグナルは無視します)。
(foo&)サブシェルを含める価値があるかもしれませ
を使用する&と、プログラムがバックグラウンドで実行されるため、プログラムが終了するまでブロックするのではなく、新しいシェルプロンプトが表示されます。nohupそしてdisown、ほとんど無関係です。これらはSIGHUP(ハングアップ)シグナルを抑制し、制御端末が閉じられたときにプログラムが自動的に強制終了されないようにします。nohupジョブが最初に開始されたときにこれを行います。nohup開始時にジョブを実行しない場合disown、実行中のジョブを変更するために使用できます。引数なしで、それは現在のジョブを変更します。
nohupそして、disownの両方を抑制すると言うことができるSIGHUPが、異なる方法で。nohupプログラムが最初にシグナルを無視するようにします(プログラムはこれを変更する場合があります)。nohupまたSIGHUP、端末が閉じられたときにカーネルによって送信されないように、制御端末を持たないようにプログラムを調整しようとします。disown純粋にシェルの内部です。SIGHUP終了時にシェルは送信しません。
disownジョブリストからジョブを削除することに関する@ ShawnJ.Goffのコメントの明確化。オプションを指定しない場合、ジョブリストから削除されます。ただし、-hオプションを指定した場合、各jobspecはテーブルから削除されません。代わりに、SIGHUPシェルがを受信した場合にジョブに送信されないようにしSIGHUPます。
&あなたの端末を与えるものではありません、それは切り離しstdinプロセスから、バックグラウンドで実行するようになりますが、両方stdoutとstderr、まだ現在のttyに装着されています。これは、さまざまなプログラムからテキストが混ざり合っている可能性があることを意味します。これを行うgimp &と、他の何かにそのttyを使用しようとしているときに多くのGTK +エラーが発生します。
これは、終了しないコマンド(例tail)に続いて、バックグラウンドでsofficeを実行しようとした私の経験です。この例では、を使用しますsleep 100。
#!/bin/bash
/opt/libreoffice4.4/program/soffice -invisible -nofirststartwizard &
sleep 100
私が見るとsoffice ログを押して/ Ctrl- Cとsofficeの停止を
#!/bin/bash
nohup /opt/libreoffice4.4/program/soffice -invisible -nofirststartwizard &
sleep 100
私は見ていないとsofficeのログを押して/ Ctrl- Cとsofficeの停止を
#!/bin/bash
/opt/libreoffice4.4/program/soffice -invisible -nofirststartwizard & disown
sleep 100
私が見るとsoffice ログを押して/ Ctrl- Cとsofficeの停止を
#!/bin/bash
setsid /opt/libreoffice4.4/program/soffice -invisible -nofirststartwizard &
sleep 100
私が見るとsoffice ログを押して/ Ctrl- Cとsofficeが止まりません
スペースを節約するために:
nohup setsid ..:ログが表示されません/とsofficeが上停止しないCtrl-C
nohupと& disown末尾に:ログを表示しません/ とsofficeは上停止しますCtrl-C
nohup ⟨command⟩ & disown作成されたプロセスはで停止しませんCtrl+C。
sofficeか?sofficeコマンドは何か違うようです。そこで、ここでルールの例外として追加することを検討しました。例えば:を使用している場合nohup .. &、Ctrl-c通常押すとコマンドは停止しませんが、停止sofficeします。誰かがこれを踏んで、なぜこれがsofficeで起こるのかを説明するまで待ちます:)
nohup soffice &て押したCtrl+C。予想通り、何も起こりませんでした。