프로그램을 실행 중인데 (대부분) 올바르게 실행되지만 중단됩니다. 특정 문자열을 출력하거나 출력 생성을 중단하자마자 프로그램이 종료되도록 프로그램을 실행하고 싶습니다.
내가 관심 있는 출력 문자열은 다음과 같습니다.
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