我有一个用 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 并终止任务?
超时是不可能的,因为任务可能需要一个多小时才能正常完成,但如果没有工作要做,则会立即退出(或者至少应该退出)。
答案1
{
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 "