Bash
關閉終端后腳本的後台程序仍然存在
這更像是一個流程管理/信號處理問題,而不是 Bash 問題。它只是使用 Bash 來解釋問題。
我正在執行一個 Bash 腳本,在該腳本中執行一個後台程序。這是腳本:
#!/bin/bash # ... # The background process { while :; do sleep 1 && echo foo >> /path/to/some/file.txt done } & # ... exit 0
我不在後台執行腳本本身。簡直了
./script
。“huponexit” shell 選項使用 啟用
shopt -s huponexit
,因此當終端關閉時,我希望它向 Bash 發送 HUP 信號,該信號將傳播到後台程序。如果後台程序不會trap
忽略信號,它也會被殺死——但這不會發生。後台程序的行為就像是disown
‘ed。這是我為說明問題而繪製的方案。該方案以及上面的描述可能是錯誤的,因為我確信我對這個主題的理解不夠好。如果確實如此,請解決我的問題。
我想知道為什麼在關閉終端后後台程序沒有被殺死,就好像它是由這樣的互動式 shell 呼叫的:
rany@~/Desktop$ while :; do sleep 1 && echo foo >> /path/to/some/file.txt; done &
我不確定,但我想我的問題的答案在於 Bash fork() 是一個非互動式 shell 來執行腳本,該腳本可能具有一組不同的作業控制和信號處理規則。
那麼手冊頁告訴我們什麼
huponexit
?如果已使用 shopt 設置了 huponexit shell 選項,則當互動式登錄shell 退出時,bash 會向所有作業發送 SIGHUP。
編輯:強調它是一個 LOGIN shell。
編輯 2:互動值得同等重視