stdout에 지속적으로 쓰는 프로그램이있는 경우 '단일 일치'옵션을 사용하여 grep하도록 파이프하면됩니다. grep이 일치하는 문자열을 찾으면 종료되고 grep으로 파이프되는 프로세스에서 stdout이 닫힙니다. 이 이벤트 는 프로세스가 다시 작성되는 한 자연스럽게 프로그램이 정상적으로 종료 되도록해야합니다 .
grep이 종료 된 후 닫힌 stdout에 쓰려고하면 프로세스에 SIGPIPE가 수신됩니다. 다음은 ping을 사용한 예입니다. 그렇지 않으면 무기한 실행됩니다.
$ ping superuser.com | grep -m 1 "icmp_seq"
이 명령은 처음으로 성공한 'pong'과 일치하고 다음 ping에 stdout에 쓰려고 시도 할 때 종료 됩니다.
하나,
프로세스가 stdout에 다시 쓰는 것이 항상 보장되는 것은 아니며 따라서 SIGPIPE가 발생하지 않을 수도 있습니다 (예 : 로그 파일의 테일링이 발생할 수 있음). 이 시나리오에서 내가 생각해 낸 최고의 솔루션은 파일에 쓰는 것입니다. 개선 할 수 있다고 생각되면 의견을 보내주십시오.
$ { tail -f log_file & echo $! > pid; } | { grep -m1 "find_me" && kill -9 $(cat pid) && rm pid; }
이것을 분해 :
tail -f log_file & echo $! > pid-파일을 테일링하고 프로세스를 백그라운드에 첨부하고 PID ( $!)를 파일에 저장합니다. 대신 PID를 변수로 내보내려고했지만 여기와 PID가 다시 사용될 때 경쟁 조건이있는 것 같습니다.
{ ... ;}- 그룹 우리가 함께 (저장하고 변수를 재사용하는 데 도움이 때,하지만 그 부분의 작업을 얻을 수 없습니다) 현재의 상황을 유지하면서 출력을 grep으로하는 파이프 할 수 있습니다 그래서이 명령을
| -왼쪽 stdout을 오른쪽 stdin으로 파이프
grep -m1 "find_me" -대상 문자열을 찾으십시오
&& kill -9 $(cat pid)- 일치하는 문자열을 찾으면 종료 후tail 프로세스 강제 종료 (SIGKILL) grep
&& rm pid -우리가 만든 파일을 제거
tail -f파일뿐만 아니라 프로그램 출력도 가능하다고 생각했을 것입니다 ... 내가 틀렸습니까?