Bash

關閉終端后腳本的後台程序仍然存在

  • January 24, 2016

這更像是一個流程管理/信號處理問題,而不是 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:互動值得同等重視

引用自:https://unix.stackexchange.com/questions/73221