簡體   English   中英

在處理SIGINT后阻止bash腳本終止

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM