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.