根据输出停止任务

根据输出停止任务

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

相关内容