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 "