Arrête une tâche en fonction de la sortie

J'ai une tâche qui s'exécute en Mono, mais parfois (randomment) le runtime Mono va se bloquer une fois la tâche terminée et il suffit d'imprimer:

_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 pour toujours. Existe-t-il un moyen d'parsingr stderr et de tuer la tâche lorsqu'un certain model est apparié?

Un timeout d'attente est hors de question parce que la tâche peut légitimement prendre plus d'une heure pour se terminer normalement, mais s'il n'y a pas de travail à faire, vous quitterez immédiatement (ou du less c'est censé le faire).

 { my-mono-app 2>&1 >&3 3>&1 | awk ' {print} /ref unused/ {print "Exiting."; exit(1)}' >&2 } 3>&1 

awk quitterait dès qu'il lit un de ces messages, provoquant my-mono-app mort de my-mono-app par un SIGPIPE la prochaine fois qu'il essaiera d'écrire quelque chose sur stderr.

Ne pas utiliser mawk là qui tampons stdin d'une manière stupide (ou utiliser -W interactive là-bas).

Si l'application ne meurt pas sur SIGPIPE, vous devrez le tuer d'une manière ou d'une autre.

Une façon pourrait être:

 { 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 

Remplacez par "kill " par "kill -s KILL " si cela ne fonctionne toujours pas.