首頁 > shell教程 閱讀:0更新時間:2020-03-28 02:19:34

Bash 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%的其他從業者!

相關文章

優秀教程

国产亚洲欧美日韩