현재 실행된 명령으로 인해 트리거된 프로세스를 제외하고 실행 중인 프로세스 인스턴스를 종료합니다.

현재 실행된 명령으로 인해 트리거된 프로세스를 제외하고 실행 중인 프로세스 인스턴스를 종료합니다.

쉘 스크립트를 사용하여 실행 중인 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

관련 정보