の違いは何ですか
$ 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
。予想通り、何も起こりませんでした。