하나의 명령으로 실행중인 프로세스의 많은 인스턴스를 종료하십시오.


75

vi실행중인 프로세스 (예 :)의 인스턴스가 천 개 이상 있다고 가정 합니다. 하나의 단일 샷 / 한 줄 명령 / 하나의 명령으로 어떻게 모두 죽일 수 있습니까?


3
어떤 시스템이 작동하는지 확실하지 않습니다. 예를 들어 Linux에서는 패키지 pkill에서 사용 procps합니다.
— 사슴 사냥꾼

이 질문은 일반적인 관점에서 제기되었습니다. 나는 killall과 awk / sed를 통한 두 가지 프로세스 만 알고있었습니다. 그러나 나는 이것을 달성하는 다른 방법이 있는지 알고 싶었습니다. 다른 시스템에서 다르게 수행되면 어떤 것이 무엇인지 알고 싶습니다. 구글에게는 매우 성가신 일입니다. 대신 경험 많은 모든 사람들과 논의 할 생각이었습니다.
— 다크 나이트

답변:


97

좋은 노인의 문제

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

다른 변형이지만 기본 수준에서는 항상 나를 위해 일했습니다.


1
위로 투표, 첫 번째 변형 만 알았습니다. 두 번째는 더 효율적으로 보입니다. 감사합니다.
— 다크 나이트

5
@TheDarkKnight이 방법의 문제점은 종종 의도 한 것보다 더 많은 것을 죽이게된다는 것입니다. 신뢰할 수있는 "일부 검색"을 작성하는 것은 까다 롭습니다. Linux 에서는 대부분의 미묘한 부분을 처리 하는 pkill을 사용 하십시오.
— Gilles

나는 그것이 까다 롭지 않다는 것을 확신하지 못한다. 특정 바이너리를 사용하고 있다면 꽤 신뢰할 수있다. echo kill -9 $pid어쨌든 나는 항상 그것을 처음 으로 실행 하므로 내가 얻는 것을 알 수 있습니다. 나는 pkill빵과 버터 유닉스 인 AIX가 확실하지 않다 . 그리고 투표를하지 않는 것이 정말 좋지 않습니다.
— EightBitTony

1
꼭 필요한 경우가 아니면 SIGKILL 대신 SIGTERM 프로세스를 보내야합니다.

나는 모든 쉘에서이 두 방법이 작동하지 않습니다 추가해야합니다 예를 들어 그것에서 작동하지 않습니다csh
— 비 sequitor

38

killall을 사용하십시오.

killall vi

이것은 'vi'라는 모든 명령을 죽입니다.

신호를 추가 할 수도 있습니다 (예 : SIGKILL)

killall -9 vi


즉 당신은 또한 당신이 좋아하는, 원하는 신호를 추가 할 수 있습니다, 맞아killall -9 vi
— 안녕 간장 에듀 펠리 즈 Navidad입니다

1
필자는 killall이 그에 대한 답이라고 생각하지 않습니다. 파일로 죽이는 것은 실행 중에 열린 상태로 유지되는 실행 파일에 대해서만 작동합니다. killall 이름을 입력하면 특히 권한이있는 사용자가 수행 할 때 Linux 이외의 시스템에 원하는 영향을 미치지 않을 수 있습니다. 일부 Linux 이외의 프로세스 인스턴스를 많이 삭제하려는 경우 어떻게해야합니까? killall -w는 프로세스가 사라 졌는지 감지하지 않으며 스캔간에 동일한 PID를 가진 새 프로세스로 대체됩니다. 프로세스가 이름을 변경하면 killall이 올바르게 일치하지 않을 수 있습니다.
— 다크 나이트

13
이것은 Linux 및 BSD에서만 작동합니다. 솔라리스와 다른 시스템 killall에서는 이름에서 알 수 있듯이 정확하게 init-process를 죽입니다.
— Bobby

2
AIX에서는 "killall 프로세스를 생성하는 프로세스를 제외하고 시작한 모든 프로세스를 취소합니다."
— EightBitTony

31

pkill가능한 경우 ( Linux , FreeBSD , NetBSD , OpenBSD , Solaris )를 권장 합니다. 명령 이름, 전체 명령 행 또는 기타 기준으로 프로세스를 지정할 수 있습니다. 예를 들어, pkill vi명령 이름에 하위 문자열이 포함 된 모든 프로그램을 종료합니다 vi. 라는 프로세스 만 종료하려면을 vi사용하십시오 pkill -x vi. 로 vi끝나는 마지막 인수로 호출 된 프로세스 만 종료 .conf하려면을 사용하십시오 pkill -fx 'vi.*\.conf'.

pkill신호를 보낼 PID 목록을 보려면를 사용 pgrep하십시오. 신호 이름 또는 숫자를 허용하지 않는 것을 제외하고는 구문이 정확히 같습니다. 이러한 프로세스에 대한 자세한 정보를 보려면 다음을 실행하십시오.

ps -p "$(pgrep …)"

리눅스에서는 ps -p $(pgrep -d, …)대신에 버그가있다 : 리눅스 ps는 POSIX 호환이 아니다.

강제 종료 할 프로세스를 식별하는 또 다른 일반적인 방법은 특정 파일이 열려있는 프로세스 (프로세스 실행 파일 일 수 있음)입니다. 이것들을 fuser;로 나열 할 수 있습니다 . fuser -k그들에게 신호를 보내는 데 사용하십시오 . 예를 들어, fuser -k /usr/bin/find실행중인 모든 isntance를 종료 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출력에 포함되는 경우 특히 중요합니다 .


정말 고마워요. 당신이 준 것은 일종의 튜토리얼입니다. 다시 감사합니다. 위로 투표
— 다크 나이트

6

pkill여기 아주 좋습니다. 패턴을 세분화하기 위해 많은 매개 변수를 제공 할 수 있습니다.


모든 UNIX에서 사용 가능한 것은 아니며 특정 UNIX 또는 UNIX와 유사한 OS에 대해서는 언급하지 않았습니다.
— EightBitTony

@EightBitTony pkill는 Linux, BSD 및 Solaris에서 사용할 수 있습니다. 그래서 그것보다 더 큰 확산이 killall있습니다.
— Nils

동의합니다. 그러나 killall은 이름이 같은 도구가 여러 개 있기 때문에 더욱 문제가 될 수 있습니다. 나는 killall 답변도 좋아하지 않습니다. pkill은 AIX 또는 HP-UX에 존재하지 않으며 일부 사람들이 믿고 싶어하는 것에도 불구하고 여전히 전 세계에 Linux 이외의 UNIX 기반이 여전히 많이 있습니다.
— EightBitTony

1
@EightBitTony 그래서 당신의 대답은 받아 들여집니다. 그러나 나는 솔라리스에서도 사용하지 않을 것입니다 (유닉스이기도합니다).
— Nils

6

가장 쉬운 방법은 먼저 올바른 프로세스 ID를 얻는 지 확인하는 것입니다.

pgrep -f [part_of_a_command]

결과가 예상대로 인 경우. 함께 가다 :

pkill -f [part_of_a_command]

또는 사용 :pgrep -f "command name"
— 마그네

3

아무도 이것에 대해 언급하지 않았다. pidof 는 전달 된 프로세스 이름과 일치하는 공백으로 구분 된 프로세스의 pid를 출력합니다. 따라서 kill배관없이 출력을 직접 사용할 수 있습니다 . 아치 리눅스에서는

kill -9 $(pidof <proc name>)

이 솔루션의 단점은 정규 표현식을 사용할 수 없다는 것입니다.


0

시도해 볼 것을 제안합니다 pkill.

전의: ps -ef | pkill -f command

종료 될 모든 프로세스 목록을 표시하려면 먼저 다음을 시도하십시오 pgrep.

전의: ps -ef | pgrep -f command


1
의 출력 배관의 목적은 무엇인가 ps -ef에 pkill또는 pgrep? 이 명령은 표준 입력에서 읽지 않습니다.
— Kusalananda

0

아래 명령을 사용하여 여러 다른 프로세스를 종료 할 수 있습니다

pkill -9 -f "\.\/.+\s\.|process1|process2|process3\[^"

이렇게하면 위 패턴과 일치하는 프로세스가 종료되고 수단도 종료 process1abc process2def process3ghi됩니다.


-1

pgrep "name-of-application" | xargs kill -9

기억하기에 충분하고 나를 위해 훌륭하게 일했습니다.


-2
$ ps -eaf  | grep "xyz" | grep -v grep | awk 'print $2' | xargs kill

당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.