簡體   English   中英

一步殺死並等待

[英]kill & wait in one step

如果我使用組合來批量殺死子進程並等待它終止,我使用

kill $PID
wait $PID

如果進程立即存在,則wait將失敗,因為 pid 不再運行。

有沒有辦法將兩個語句組合成一個語句來避免錯誤?

編輯:我必須殺死的進程使用臨時文件; 因此它必須關閉(而不僅僅是發出關閉信號)才能再次啟動它。 檢查kill的返回值無濟於事,因為這表明信號是否已成功傳遞。

它不是單行的,但是您是否願意考慮在短暫的睡眠后產生殺戮,然后在主線程中等待? 就像是:

(sleep 1; kill $PID) &
wait $PID

這解決了您對殺死后 PID 被重用的擔憂。 即使您將sleep減少到更小,它也會引入空閑時間,但它至少應該確保您wait正確的進程。

實際上,沒有原子性的終止和等待,因為它們是兩個獨立的系統調用。 必須編寫一些包裝器來執行這兩個函數。

如果你不在乎狀態,

kill $PID 2> /dev/null
wait $PID 2> /dev/null

如果您確實關心狀態,但不想要錯誤消息,請執行以下操作

if ! kill $PID 2> /dev/null; then
    # Error logic here
fi

兩者的奇特方式是一個函數

killAndWait() {
    kill $1 2> /dev/null && wait $1 2> /dev/null
}

然后做

killAndWait $PID
kill $PID wait $PID

如果進程立即存在,則wait將失敗,因為 pid 不再運行。

只要$PID確實指向 shell 的子進程,我認為wait不會失敗。 我沒有看到您的代碼有錯誤。

實驗:

bash-3.2$ while : ; do ls > /dev/null ; done &
[1] 44908
bash-3.2$ kill 44908
[1]+  Terminated: [...]
bash-3.2$ wait 44908
bash-3.2$ echo $?
143

143 是 SIGTERM 的返回碼,因此kill按預期工作,並且 Bash 可以wait死進程。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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