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

У меня есть задача, написанная в 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 и уничтожения задачи при сопоставлении определенного шаблона?

Тайм-аут не может быть и речи, потому что задача может законно занять более часа, чтобы закончить нормально, но если нет работы, которая будет выполнена, она немедленно выйдет (или, по крайней мере, она должна).

  • Исправлена ​​ошибка «firefox уже запущена» в Linux
  • Действительно ли `kill -p` действительно работает?
  • Как убить упрямый процесс
  • Изящный способ убить процесс
  • Убивание фонового процесса в скрипте bash при выходе из скрипта
  • Что делать, если «kill -9» не работает?
  • Как найти источник нереста?
  • Как (если возможно) я могу закончить конкретный блокиратор, зависающий программой?
  • One Solution collect form web for “Остановить задачу на основе вывода”

     { 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 " если он все еще не работает.

    Linux и Unix - лучшая ОС в мире.