Kill

根據輸出停止任務

  • April 27, 2016

我有一個用 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 "

引用自:https://unix.stackexchange.com/questions/84999