특정 출력이 생성되면 프로세스를 종료합니다.

특정 출력이 생성되면 프로세스를 종료합니다.

프로그램을 실행 중인데 (대부분) 올바르게 실행되지만 중단됩니다. 특정 문자열을 출력하거나 출력 생성을 중단하자마자 프로그램이 종료되도록 프로그램을 실행하고 싶습니다.

내가 관심 있는 출력 문자열은 다음과 같습니다.

Was exported to:

이 출력을 본 후 프로그램을 자동으로 종료하고 싶습니다. 또는 이 후에 프로그램이 출력 생성을 중단하므로 해당 조건에 따라 프로그램을 종료할 수 있습니다. 이 중 하나를 어떻게 구현할 수 있나요?

답변1

Process substitution한 가지 옵션은 이 도구를 grep으로 실행하는 것입니다.

grep -m 1 "Was exported to:" <(<command>)

첫 번째 일치 후 실행을 중지하도록 grep에 지시합니다 -m 1. 실행이 중지되면 내부 명령 <( ... )도 종료됩니다. 그러나 제 생각에는 이것은 약간 "추악한" 것입니다.

여전히 사용되지만 grep내부에서 명령을 실행할 필요 없이 출력을 파일로 리디렉션하고 백그라운드에서 실행한 다음 프로세스를 사용하여 파일을 읽고 tail -F, grep출력하고, kill첫 번째 일치 후에 출력하는 것입니다.

COMMAND > $OUTPUTFILE & tail --pid=$! -n +1 -F $OUTPTFILE | (grep -q -m 1 "Was exported to:" && kill $!)

이는 프로세스가 완료되거나 종료되면 실행도 중지되도록 --pid=$!하기 위한 것입니다 .tail

grep그러나 두 방법 모두 실행 중인 줄 뒤에 개행 문자가 오는 경우에만 작동합니다.

답변2

다음을 수행할 수 있습니다.

sh -c 'echo "$$"; exec stdbuf -oL "$0" "$@"' my-program with its args | (
  IFS= read -r pid &&
    sed '/Was exported to:/q' &&
    kill -s PIPE "$pid"
)

라인 기반 버퍼링(응용 프로그램은 블록 버퍼링을 수행하는 경향이 있음)을 복원하기 위해 my-program이전에 실행한 프로세스(GNU 또는 FreeBSD 기반 시스템에서 발견)와 동일한 프로세스를 실행 sh하고 해당 pid를 파이프로 보냅니다. stdbuf -oL터미널로 전송됨)

파이프의 반대쪽 끝에서 sed기다리면 처음으로 uit가 나타납니다 Was exported to:. q그 후 SIGPIPE 신호가 pid로 전송되어 프로세스가 종료됩니다. 이것이 없으면 SIGPIPE는 kill종료 my-program후 파이프에 쓸 때만 수신됩니다 .grep

관련 정보