Bash

在 Bash 中將 SIGTERM 轉發給孩子

  • October 8, 2021

我有一個 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)。

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