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


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 -efpkill또는 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.