Shell-Script
為什麼 sleep 在 shell 腳本中執行時會忽略 SIGINT?
當我
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 腳本中執行時,為什麼/如何忽略睡眠?我得到與
dash
and相同的行為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>)。