Linux Shell移除(重置)信號捕獲
當沒有任何捕獲時,一個交互式 Bash shell 會忽略 SIGTERM 和 SIGQUIT 信號。由 Bash 運行的非內部命令會使用 Shell 從其父進程繼承的信號處理程序。如果沒有啟用作業控制,異步執行的命令會忽略除了有這些信號處理程序之外的 SIGINT 和 SIGQUIT 信號。由于命令替換而運行的命令會忽略鍵盤產生的作業控制信號SIGTTIN、SIGTTOU 和 SIGTSTP。
默認情況下,Shell 接收到 SIGHUP 信號后會退出。在退出之前,一個交互式的 Shell 會向所有的作業,不管是正在運行的還是已停止的,重新發送 SIGHUP 信號。對已停止的作業,Shell 還會發送 SIGCONT 信號以確保它能夠接收到 SIGHUP 信號。
若要阻止 Shell 向某個特定的作業發送 SIGHUP 信號,可以使用內部命令 disown 將它從作業表中移除,或是用“disown -h”命令阻止 Shell 向特定的作業發送 SIGHUP 信號,但并不會將特定的作業從作業表中移除。
我們通過如下實例,來了解一下 disown 命令的作用:
#將 sleep 命令放在后臺執行,休眠30秒 [c.biancheng.net]$ sleep 30 & [1] 8052 #列出當前 Shell 下所有作業的信息 [c.biancheng.net]$ jobs -l [1]+ 8052 Running sleep 30 & #將作業1從作業表中移除 [c.biancheng.net]$ disown %1 #再次列出當前 Shell 下所有作業的信息 [c.biancheng.net]$ jobs -l #查找 sleep 進程 [c.biancheng.net]$ ps -ef | grep sleep mozhiyan 8052 8092 cons1 11:28:21 /usr/bin/sleep #打印當前 Shell 的進程號 [c.biancheng.net]$ echo $$ 8092
在上述實例中,我們首先將命令“sleep 30”放在后臺運行,此時,我們使用命令“jobs -l”可以看到作業表中有一個正在運行的作業,然后,我們使用命令“disown %1”將作業1從作業表中移除,再使用命令“jobs -l”會看到作業表中已經沒有了作業,但是我們發現其實“sleep 30”這個命令的進程仍然存在。此時,Shell 若接收到 SIGHUP 信號,它就不會向作業1重新發送 SIGHUP 信號,此時如果我們退出 Shell,這個作業仍將繼續運行,而不會被終止。
我們再來看一下命令“disown -h”的用途:
#將 sleep 命令放在后臺執行,休眠30秒 [c.biancheng.net]$ sleep 30 & [1] 3184 #列出當前 Shell 下所有作業的信息 [c.biancheng.net]$ jobs -l [1]+ 3184 Running sleep 30 & #阻止 Shell 向作業1發送 SIGHUP 信號 [c.biancheng.net]$ disown -h %1 [c.biancheng.net]$ jobs -l [1]+ 3184 Running sleep 30 &
我們看到,在執行了命令“disown -h %1”后,作業1并沒有從作業表中移除,但它己經被標記,所以即使 Shell 收到 SIGHUP 信號也不會向此作業發送 SIGHUP 信號。因此, 如果此時我們退出 Shell,這個作業也仍將繼續運行,而不會被終止。
注意:如果使用內部命令 shopt 打開了 Shell 的 huponexit 選項,當一個交互式的登錄 Shell 退出時,會向所有的作業發送 SIGHUP 信號。
beylze編程學院,一個分享編程知識和seo優化知識的網站。跟著beylze一起學習,每天都有進步。
通俗易懂,深入淺出,一篇文章只講一個知識點。
文章不深奧,不需要鉆研,在公交、在地鐵、在廁所都可以閱讀,隨時隨地漲姿勢。
文章不涉及代碼,不燒腦細胞,人人都可以學習。
當你決定關注beylze(公眾號:beylze),你已然超越了90%的其他從業者!