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
関数を使用して非受信としてマークする必要があります。 。SIGHUP
disown -h
huponexit
シェルオプションがに設定されている場合、対話shopt
型ログインシェルが終了すると、すべてのジョブにaが送信されますbash
。SIGHUP
disown [-ar] [-h] [jobspec ... | pid ... ]
オプションがない場合は、アクティブな
jobspec
タスクリストから各タスクを削除します。 [...]-h
オプションが与えられると、jobspec
それぞれ削除されないテーブルには次のように表示されます。SIGHUP
シェルSIGHUP
。 [...]
関連:
答え2
彼らは違う:
disown は、アクティブなタスクのリストからそのタスクを削除します。その後、現在の作業を続けます。 -h を使用する手順は次のとおりです。いいえSIGHUPを送ってください。代わりにSIGHUPを受け取ると、含まれているシェルで死にます。
nohupはHUPを無視します。その後、プロセスが終了したときに端末に渡されたすべての内容がファイルに転送されます
nohup.out
。nohupはPOSIXによって定義されますが、disownはそうではありません。