하나의 명령을 사용하여 실행 중인 프로세스의 여러 인스턴스 종료

하나의 명령을 사용하여 실행 중인 프로세스의 여러 인스턴스 종료

vi임의의 프로세스(예: )에서 실행 중인 인스턴스가 수천 개 이상 있다고 가정해 보겠습니다 . 한 번의 히트/라인/명령으로 어떻게 모두 죽일 수 있습니까?

답변1

그 좋은 노인에게 무슨 일이 일어났나요?

for pid in $(ps -ef | grep "some search" | awk '{print $2}'); do kill -9 $pid; done

효율성을 높이는 방법도 있지만,

for pid in $(ps -ef | awk '/some search/ {print $2}'); do kill -9 $pid; done

및 기타 변형이 있지만 기본 수준에서는 항상 나에게 효과적입니다.

답변2

킬올을 사용하세요.

killall vi

이렇게 하면 "vi"라는 이름의 모든 명령이 종료됩니다.

SIGKILL과 같은 신호를 추가할 수도 있습니다.

killall -9 vi

답변3

pkill이것이 가능하다면 제가 추천하고 싶은 것입니다(리눅스,FreeBSD,네트워크BSD,오픈BSD,솔라리스). 명령 이름, 전체 명령줄 또는 기타 기준으로 프로세스를 지정할 수 있습니다. 예를 들어 pkill vi명령 이름에 하위 문자열이 포함된 모든 프로그램을 종료합니다 vi. 호출 프로세스만 종료하려면 vi를 사용하십시오 pkill -x vi. vi마지막 인수로 끝나는 프로세스 만 종료하려면 .conf를 사용하십시오 pkill -fx 'vi.*\.conf'.

pkill신호가 전송될 PID 목록을 보려면 pgrep신호 이름이나 번호를 허용하지 않는다는 점을 제외하면 구문이 정확히 동일한 을 사용하십시오. 이러한 프로세스에 대한 자세한 내용을 보려면 다음을 실행하세요.

ps -p "$(pgrep …)"

Linux에서는 다음으로 변경해야 합니다 ps -p $(pgrep -d, …)(이것은 버그입니다. Linux는 psPOSIX와 호환되지 않습니다).

종료할 프로세스를 식별하는 또 다른 일반적인 방법은 일부 파일이 열려 있는 프로세스(프로세스의 실행 파일일 수 있음)입니다. 다음을 나열할 수 있습니다.fuserfuser -k; 신호를 보내는 데 사용됩니다 . 예를 들어 fuser -k /usr/bin/find실행 중인 모든 인스턴스를 종료합니다 find.

계속 포크하는 런어웨이 프로세스가 있는 경우 전체 프로세스를 종료해야 할 수도 있습니다.프로세스 그룹즉시. 프로세스 그룹은 그룹 내 모든 프로세스의 조상 프로세스인 리더의 음수로 식별됩니다. 프로세스가 속한 프로세스 그룹을 보려면 실행 ps -o pgid(표시할 프로세스를 선택하기 위한 옵션 포함)을 실행하세요. 프로세스 그룹 리더 1234와 모든 하위 프로세스를 종료하려면 다른 신호를 실행 kill -1234하세요 .kill -HUP -1234

더 나은 방법을 찾을 수 없으면 적절한 옵션을 사용하여 모든 프로세스를 나열하고 ps다른 텍스트 필터링 명령을 사용하여 필터링하십시오. grep비슷한 이름이나 해당 이름이 포함된 인수를 사용하여 명령을 실행하는 다른 프로세스와 실수로 일치하지 않도록 주의하세요. 예를 들어:

kill $(ps -o pid -o comm | awk '$2 == "vi" {print $1}')

grep또는 awk명령 자체가 출력에 나열될 수 있다는 점을 명심하십시오 ps( ps필터 명령은 병렬로 실행되므로 표시 여부는 타이밍에 따라 다릅니다). 이는 명령 매개변수가 출력에 포함된 경우 ps특히 중요합니다 .

답변4

pkill여기가 좋아요. 패턴을 다듬기 위해 많은 매개변수를 제공할 수 있습니다.

관련 정보