`disown -h`と` nohup`は同じように機能しますか?


18

disown

  • シェルが終了したときに、シェルが非所有のジョブにSIGHUPを送信しないようにします。

  • 否認されたジョブをシェルのジョブ制御から削除します。

最初は2番目の結果ですか?言い換えると、シェルから開始されたプロセスが何らかの方法でシェルのジョブ制御から削除された場合、シェルは終了時にSIGHUPをプロセスに送信しませんか?

disown -h シェルのジョブ制御下でプロセスを維持します。これdisown -hは、プロセスがシェルから送信されたSIGHUPを引き続き受信するが、プロセスによるSIGHUPのアクションを「無視」するように設定するということですか?それはに似ていnohupます。

$ sleep 123 & disown -h
[1] 26103
$ jobs
[1]+  Running                 sleep 123 &
$ fg 1
sleep 123
$ ^Z
[1]+  Stopped                 sleep 125
$ bg 1
[1]+ sleep 123 &
$ exit

$ ps aux | grep sleep
t        26103  0.0  0.0  14584   824 ?        S    15:19   0:00 sleep 123

やるdisown -hnohup我々は、端末を使用してその差を無視すれば、効果的に同じ動作しますか?

ありがとう。


ここで説明されていない別の違いはnohup、を使用していない場合、stdin / stdout / stderrをTTYからリダイレクトする必要があることです(元のシェルが接続されている場合)。(OTOH、私は実際に、のようなひどいハードコードされたデフォルトに依存するよりも良いプラクティスだと考えています./nohup.out)。
チャールズダフィー

回答:


21

nohupそして、disown -hはありません正確に同じこと。

を使用disownすると、現在の対話型シェルのジョブのリストからプロセスが削除されます。jobsバックグラウンドプロセスを開始して実行した後に実行disownすると、シェルでそのプロセスがジョブとして表示されません。否認されたジョブはHUP、終了時にシェルからa を受け取りません(ただし、最後の注を参照)。

を使用するdisown -hと、ジョブはジョブのリストから削除されませんが、シェルはHUP終了してもシグナルを送信しません(ただし、最後の注を参照)。

nohupユーティリティは無視HUP信号を、与えられたユーティリティを起動します。ユーティリティはシグナルマスクを継承nohupするため、HUPシグナルも無視します。シェルが終了すると、プロセスはの子プロセスのままになりますnohup(そしてnohup親プロセスに再設定されますinit)。

違いは、シグナルの送信者に関係なく、nohup無視で開始されたプロセスHUPです。勘当プロセスがちょうどされていない送信されたHUP信号を、シェルが、それでも例えばからの信号を送ることができるkill -s HUP <pid>と、これを無視しないでしょう。

次のHUP場合にのみシェルのジョブに送信されることに注意してください。

  • シェルがログインシェルであり、huponexitシェルオプションが設定されている、または
  • シェル自体がHUPシグナルを受信します。

bashマニュアルからの関連ビット(私の強調):

信号

[...]

デフォルトではSIGHUPシェルはを受信すると終了します。終了する前に、対話型シェルSIGHUPは実行中または停止中のすべてのジョブに再送信します。停止されたジョブは送信されSIGCONT、確実に受信し SIGHUPます。シェルが特定のジョブにシグナルを送信しないようにするには、disown組み込みのジョブテーブルから削除SHELL BUILTIN COMMANDSするか(下記を参照)、またはをSIGHUP 使用して受信しないようにマークする必要がありますdisown -h

場合はhuponexit、シェルのオプションはで設定されているshoptbash送信し SIGHUPたすべてのジョブ対話的なログインシェルが終了するが。

disown [-ar] [-h] [jobspec ... | pid ... ]

オプションなしでjobspec、アクティブなジョブのテーブルからそれぞれを削除します。[...] -hオプションが指定れている場合、それぞれjobspecはテーブルから削除さませんSIGHUP、シェルがを受信した場合にジョブに送信されないSIGHUPようにマークされます。[...]

関連:


私が得るbash: disown: nohup: no such jobために、同じsleep5からdisown nohup sleep 5 &。最後の文の2番目のコマンドはどういう意味ですか?
ルスラン

はい@Ruslan私が欠けている&そこに(との順序nohupとはdisownまた間違っていました)。ありがとう。今すぐ更新します。
クサラナナンダ


@Tim回答を過度に編集して申し訳ありません。頭を動かすのに時間がかかった。できました。
クサラナナンダ

ありがとう。disownシェルのジョブリストから子を削除することにより、シェルが子にSIGHUPを送信しないようにします。disown -h同じことをどのように達成しますか?
ティム

4

彼らは違う:

  • disownは、アクティブなジョブテーブルからジョブを削除します。その後、現在のジョブを続行します。-hを使用すると、プロセスはSIGHUPに送信されません。代わりに、SIGHUPを受信したときに、それを含むシェルで死ぬことがあります。

  • nohupはHUPを無視します。次に、プロセスのクローズによって端末に渡されたものはすべてファイルに送られますnohup.out

    nohupはPOSIXによって定義されますが、disownは定義されません。


「それを含むシェルで死ぬ」とはどういう意味ですか?親プロセスを強制終了しても、それ自体は子を強制終了しません。通常、端末が閉じられているプログラムは、端末のPTYに接続されているファイルハンドルとのやり取りに関連する障害のために停止しますが、stdin / stdout / stderrが他の場所にリダイレクトされた場合、それは起こりません。
チャールズダフィー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.