Kill
根據輸出停止任務
我有一個用 Mono 編寫的任務,但是有時(隨機)Mono 執行時會在任務完成後掛起並列印:
_wapi_handle_ref: Attempting to ref unused handle 0x2828 _wapi_handle_unref_full: Attempting to unref unused handle 0x2828 _wapi_handle_ref: Attempting to ref unused handle 0x2828 _wapi_handle_unref_full: Attempting to unref unused handle 0x2828 ...
到 stderr 永遠。有沒有一種方法可以在匹配某個模式時解析 stderr 並終止任務?
超時是不可能的,因為該任務可能需要一個多小時才能正常完成,但如果沒有工作要做,則會立即退出(或者至少應該退出)。
{ my-mono-app 2>&1 >&3 3>&1 | awk ' {print} /ref unused/ {print "Exiting."; exit(1)}' >&2 } 3>&1
awk
它將在讀取其中一條消息後立即退出,從而導致在下次嘗試在 stderr 上寫入內容時my-mono-app
被 a 殺死。SIGPIPE
不要
mawk
在那里以愚蠢的方式使用緩衝標準輸入(或-W interactive
在那裡使用)。如果應用程序沒有在 SIGPIPE 上死掉,你將不得不以某種方式殺死它。
一種方法可能是:
{ sh -c 'echo "$$" >&2; exec my-mono-app' 2>&1 >&3 3>&1 | awk ' NR == 1 {pid = $0; next} {print} /ref unused/ && ! killed { print "Killing",pid killed=1 system("kill " pid) }' >&2 } 3>&1
如果它仍然不起作用
"kill "
,請替換為。"kill -s KILL "