쉘 스크립트를 사용하여 실행 중인 모든 Xvfb 인스턴스를 종료해야 하므로 다음 코드가 있습니다.
for pid in $(ps -ef | awk '/Xvfb/ {print $2}'); do kill -9 $pid; done
모든 인스턴스가 종료되지만 다음 오류로 인해 하나가 실패합니다.
kill: (142898) - No such process
위에서 실행된 명령은 다른 인스턴스를 생성하는 것처럼 보이지만 종료되면 더 이상 존재하지 않습니다. 이런 경우 어떻게 건너뛰고 스크립트를 성공적으로 사용할 수 있나요?
답변1
문제는 ps
"Xvfb" 문자열을 찾는 호출 에 출력을 파이프하여 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