
這更像是進程管理/訊號處理問題,而不是 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 來運行腳本,該腳本可能有一組不同的作業控制和訊號處理規則。
答案1
那麼手冊頁告訴我們什麼呢huponexit
?
如果已使用 shopt 設定了 huponexit shell 選項,則當出現下列情況時,bash 會向所有作業傳送 SIGHUP:互動式登入外殼退出。
編輯:強調它是一個登入外殼。
編輯2:互動性值得同等重視