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

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

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

相關內容