Остановить задачу на основе вывода

У меня есть задача, написанная в 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 выйдет, как только он прочитает одно из этих сообщений, в результате чего my-mono-app будет убит SIGPIPE в следующий раз, когда он попытается написать что-то на stderr.

Не используйте mawk там, где буферы stdin глупым способом (или используйте -W interactive there).

Если приложение не умирает на 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 " если он все еще не работает.