[英]How to properly sigint a bash script that is run from another bash script?
[英]Prevent a bash script from terminating after handling a SIGINT
我正在為應用程序編寫一個bash包裝器。 該包裝器負責更改用戶,運行軟件和記錄其輸出。 我也希望它傳播SIGINT信號。
到目前為止,這是我的代碼:
#!/bin/bash
set -e; set -u
function child_of {
ps --ppid $1 -o "pid" --no-headers | head -n1
}
function handle_int {
echo "Received SIGINT"
kill -int $(child_of $SU_PID)
}
su myuser -p -c "bash /opt/loop.sh 2>&1 | tee -i >(logger -t mytag)" &
SU_PID=$!
trap "handle_int" SIGINT
wait $SU_PID
echo "This is the end."
我的問題是,當我向這個包裝器發送一個SIGINT時, handle_int
被調用但是腳本結束了,而我希望它繼續等待$SU_PID
。
有沒有辦法捕獲int信號,做一些事情,然后阻止腳本終止?
你有一個問題:在Ctrl-C之后,“這就是結束。” 預計但它永遠不會到來,因為腳本已經過早退出。 原因是在set -e
下運行時wait
(意外地)返回非零值。
根據“男子打擊”:
如果bash正在等待命令完成並收到已設置陷阱的信號,則在命令完成之前不會執行該陷阱。 當bash通過wait builtin等待異步命令時 ,接收到已設置陷阱的信號將導致wait builtin立即返回, 退出狀態大於128 ,之后立即執行陷阱。
您應該將wait
調用包裝在set +e
以便在等待異步命令時處理捕獲的信號后程序可以繼續運行。
像這樣:
# wait function that handles trapped signal on asynchronous commands.
function safe_async_wait {
set +e
wait $1 # returns >128 on asynchronous commands
set -e
}
#...
safe_async_wait $SU_PID
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.