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を解析して操作を終了する方法はありますか?
ジョブは正常に完了するのに1時間以上かかる可能性があるため、タイムアウトはできませんが、実行するジョブがないとすぐに終了します(または少なくとも終了する必要があります)。
答え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
。SIGPIPE
mawk
愚かな方法でstdinをバッファリングするために使用しないでください(または-W interactive
使用しないでください)。
アプリケーションがSIGPIPEで終了しない場合は、何らかの方法で終了する必要があります。
1つのアプローチは次のとおりです。
{ 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 "