Shell-Script

為什麼 sleep 在 shell 腳本中執行時會忽略 SIGINT?

  • May 31, 2021

當我sleep手動執行,然後kill -INT它,睡眠立即退出。例如:

$  /bin/sleep  60  &
[1] 4002356
$  kill -INT 4002356
[1]+  Interrupt               /bin/sleep 60
$  ps -C sleep
   PID TTY          TIME CMD
$  

但是,當我在 shell 腳本中做同樣的事情時,會sleep忽略SIGINT. 例如:

set  -o xtrace

echo
/bin/sleep  10  &
child="$!"
/bin/sleep  0.1
ps -C sleep
kill  -TERM  "$child"    #  SIGTERM                                         
/bin/sleep  0.1
ps -C sleep
wait  "$child"    #  will return immediately                                

echo
/bin/sleep  10  &
child="$!"
/bin/sleep  0.1
ps -C sleep
kill  -INT  "$child"    #  SIGINT
/bin/sleep  0.1
ps -C sleep
wait  "$child"    #  will wait for 9.8 seconds                              

SIGINT當我sleep在 shell 腳本中執行時,為什麼/如何忽略睡眠?

我得到與dashand相同的行為bash。我的核心是 Linux 5.4.0。

/bin/sleep 10 &終止&時使 shellsleep非同步執行。作業控制在腳本中預設禁用。在 Bash 中,以下適用

$$ emphasis mine $$:

由 Bash 啟動的非內置命令將信號處理程序設置為 shell 從其父級繼承的值。**當作業控制無效時,**除了這些繼承的處理程序之外,非同步命令還會忽略 SIGINT 和 SIGQUIT。

資料來源:Bash 參考手冊

並且相關地,SIG_IGN在對 的呼叫中持續存在execv(),可能是SIGCHLD.

在呼叫程序映像中設置為預設操作(SIG_DFL)的信號應設置為新程序映像中的預設操作。除了 SIGCHLD,呼叫程序映像設置為忽略的信號 (SIG_IGN) 應設置為被新程序映像忽略。設置為由呼叫過程映像擷取的信號應設置為新過程映像中的預設操作(參見 <signal.h>)。

資料來源:The Open Group Base Specification 第 7 期,2018 年版

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