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

`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 -h端末を使用するときの違いを無視すると、nohup同じようにうまく機能しますか?

ありがとうございます。

ベストアンサー1

nohupそしてdisown -hではない正確に同じもの。

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

を使用すると、タスクdisown -hはタスクリストから削除されませんが、HUPシェルは終了時にシグナルを送信しません(ただし、最後の注意事項を参照)。

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

違いは、誰が信号を送信しても、プロセスはnohupそれを無視することです。HUP拒否されるプロセスは次のとおりです。送るHUPシグナルシェルを通してしかし、たとえばから信号を送信することはまだ可能であり、kill -s HUP <pid>これは無視されません。

HUPシェルに送信されたジョブは、次の場合にのみ送信されます。

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

マニュアルの関連内容bash(強調):

シグナル

[...]

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

huponexitシェルオプションがに設定されている場合、対話shopt型ログインシェルが終了すると、すべてのジョブにaが送信されますbashSIGHUP

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

オプションがない場合は、アクティブなjobspecタスクリストから各タスクを削除します。 [...]-hオプションが与えられると、jobspecそれぞれ削除されないテーブルには次のように表示されます。SIGHUPシェルSIGHUP。 [...]

関連:

おすすめ記事