Bash
在 Bash 中將 SIGTERM 轉發給孩子
我有一個 Bash 腳本,它看起來類似於:
#!/bin/bash echo "Doing some initial work...."; /bin/start/main/server --nodaemon
現在,如果執行腳本的 bash shell 接收到 SIGTERM 信號,它還應該向正在執行的伺服器發送一個 SIGTERM 信號(這會阻塞,因此不可能出現陷阱)。那可能嗎?
嘗試:
#!/bin/bash _term() { echo "Caught SIGTERM signal!" kill -TERM "$child" 2>/dev/null } trap _term SIGTERM echo "Doing some initial work..."; /bin/start/main/server --nodaemon & child=$! wait "$child"
通常,
bash
在子程序執行時會忽略任何信號。啟動伺服器&
會將其置於 shell 的作業控制系統中,並$!
保存伺服器的 PID(與wait
和一起使用kill
)。然後呼叫wait
將等待具有指定 PID(伺服器)的作業完成,或等待任何信號被觸發。當 shell 接收
SIGTERM
(或伺服器獨立退出)時,wait
呼叫將返回(使用伺服器的退出程式碼退出,或者在收到信號的情況下使用信號編號 + 128)。之後,如果 shell 收到 SIGTERM,它將_term
在退出之前呼叫指定為 SIGTERM 陷阱處理程序的函式(我們在其中進行任何清理並使用 手動將信號傳播到伺服器程序kill
)。