출력에 따라 작업 중지

출력에 따라 작업 중지

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에서 종료되지 않으면 어떻게든 종료해야 합니다.

한 가지 접근 방식은 다음과 같습니다.

{ 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 "

관련 정보