出力に応じてジョブを停止

出力に応じてジョブを停止

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-appSIGPIPE

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 "

関連情報