web-dev-qa-db-ja.com

「disown -h」と「Nohup」は効果的に同じように機能しますか?

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は、ターミナルを使用する際の違いを無視すると、実質的に同じように機能しますか?

ありがとう。

18
Tim

Nohupdisown -hはまったく同じではありません // exactly .

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

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

Nohupユーティリティは、HUP信号を無視して、指定されたユーティリティを起動します。ユーティリティはNohupからシグナルマスクを継承するため、HUPシグナルも無視します。シェルが終了すると、プロセスはNohupの子プロセスとして残ります(Nohupinitに親が変更されます)。

違いは、Nohupで開始されたプロセスは、だれがシグナルを送信したかに関係なくHUPを無視することです。取り消されたプロセスは、 sent HUP signal by the Shell だけではありませんが、たとえば、 kill -s HUP <pid>、これは無視されません。

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

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

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

信号

[...]

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

huponexitシェルオプションがshoptで設定されている場合、bashは、インタラクティブログインシェルの終了時にSIGHUPをすべてのジョブに送信します。

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

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

関連:

21
Kusalananda

それらは異なります:

  • disownは、アクティブなジョブテーブルからジョブを削除します。その後、現在のジョブを続行します。 -hを指定すると、プロセスは[〜#〜] [〜#〜]でSIGHUPを送信します。代わりに、SIGHUPを受け取ったときに、それを含むシェルと共に死ぬことになります。

  • NohupはHUPを無視します。次に、プロセスの終了によってターミナルに渡されたものはすべて、代わりにファイルNohup.out

    NohupはPOSIXで定義されていますが、disownは定義されていません。

4