쉘 스크립트를 사용하여 실행 중인 Xvfb의 모든 인스턴스를 종료해야 하므로 다음 코드가 있습니다.
for pid in $(ps -ef | awk '/Xvfb/ {print $2}'); do kill -9 $pid; done
모든 인스턴스가 종료되지만 다음 오류로 인해 하나가 실패합니다.
kill: (142898) - No such process
위의 실행된 명령은 인스턴스를 하나 더 생성하지만 종료하는 동안 더 이상 존재하지 않는 것 같습니다. 이런 경우 어떻게 건너뛰고 스크립트에 성공할 수 있나요?
답변1
문제는 "Xvfb" 문자열을 찾는 ps
호출에 출력을 파이프하여 awk
자체 명령줄에 "Xvfb" 문자열도 포함한다는 것입니다. 파이프의 두 프로세스가 동시에 실행되기 때문에 awk
호출 자체도 출력에 등록됩니다 ( 명령줄에 ps
입력하면 어떻게 되는지 시험해 보세요 ).ps -ef | awk '/Xvfb/'
그러나 루프가 시작될 때(명령 대체 $( … )
및 awk
프로세스도 종료될 때 발생) 이 awk
프로세스는 더 이상 존재하지 않으므로 kill
우연히 발견됩니다.
명령 대체에서 명령을 다음으로 수정하면 안전합니다.
ps -ef | awk '$0 ~ /Xvfb/ && index($0,"awk")==0 {print $2}'
그러면 하위 문자열을 포함하는 명령이 awk
목록에 포함되지 않습니다.
답변2
당신은 을(를) 죽이려고 합니다 awk
.
이를 방지하기 위한 간단한 정규식 트릭은 일종의 이스케이프를 사용하는 것입니다. 와 같은 wor[d]
.
따라서 귀하의 코드에 대해 (변수 인용이 추가됨)
for pid in $(ps -ef | awk '/Xvf[b]/ {print $2}'); do kill -9 "$pid"; done