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