주어진 부분 이름으로 모든 프로세스를 종료하는 방법은 무엇입니까? [닫은]


622

내가 얻는 모든 프로세스를 죽이고 싶습니다.

ps aux | grep my_pattern

어떻게합니까?

작동하지 않습니다.

pkill my_pattern

11
my_pattern단순히 이름의 문자열, 또는 어떤 정규식 특수 문자가 포함되어 있습니까?
Sven Marnach 2012 년

답변:


1317

pkill -f명령 줄의 모든 부분에 대한 패턴과 일치하는을 사용하십시오 .

pkill -f my_pattern

7
@Jayan : 그것은 또한 살해에있어서 무차별 적입니다. 놀랍게도 잘못
다루기

1
@Jayan : 당신은 저를 설득하지 않을 것입니다 :-). 나는 사용을 주장하는 타사 스크립트에 의해 너무 여러 번 불타 버렸습니다 pkill. 가장 일반적인 실수는 주어진 시간에 각 바이너리의 인스턴스 하나만 존재할 수 있다는 가정입니다.
thkala

4
이 답변을 찾은 Mac 사용자의 경우 Mac과 동일 killall -m my_pattern합니다.
Zev Eisenberg

1
죽이지 않는 많은 교수형 프로세스가 있다면 pkill -f -9를 사용하여 무자비하게 죽이십시오
MacK

18
pgrep먼저 무엇을 죽일 것인지 확인하는 것이 좋습니다 . pgrep -l프로세스 이름 pgrep -a을 보거나 전체 명령 행을 보는 데 사용할 수 있습니다 . pkill과 동일한 플래그를 사용합니다. 따라서이 경우을 사용할 수 있습니다 pgrep -fa my_pattern.
studgeek

158

"myProcessName"문자열과 일치하는 모든 프로세스를 종료하십시오.

ps -ef | grep 'myProcessName' | grep -v grep | awk '{print $2}' | xargs -r kill -9

출처 : http://www.commandlinefu.com/commands/view/1138/ps-ef-grep-process-grep-v-grep-awk-print-2-xargs-kill-9

이 코드는 무엇을하고 있습니까?

ps -ef이 사용자에게 표시 컴퓨터에서 처리 ID의 목록을 생성합니다. 파이프 그렙은 해당 문자열이 포함 된 행을 필터링합니다. 는 grep -v grepgrepping을 수행하는 과정 자체에 일치하지 않는 말했다. 파이프 awk 인쇄는 기본 구분 기호 공백의 행을 분할하고 프로세스 ID 인 두 번째 열로 필터링한다고 말합니다. 파이프 xargs는 모든 pid를 보내기 위해 새로운 프로세스를 시작하여 kill -9끝납니다.

위의 코드는 몇 가지 이유로 나쁘고 위험하며 추악하고 해킹 적입니다.

  1. 강제 종료되는 코드가 확률이 낮은 경쟁 조건으로 데이터베이스 운영 또는 보안 트랜잭션을 수행하는 경우 시간의 일부, 시간의 일부, 해당 트랜잭션의 원 자성이 손상되어 정의되지 않은 동작이 생성됩니다. kill -9는 죄수를 취하지 않습니다. 코드가이 코드에 민감한 경우 xargs kill부품을 정상적인 종료를 요청하는 전송 된 플래그로 교체하고 해당 요청이 거부 된 경우에만kill -9

  2. 실수로 운영 체제를 종료하거나 관련이없는 프로세스에서 정의되지 않은 동작을 일으켜 ps -ef존재하는 모든 가능한 프로세스를 나열 하기 때문에 전체 시스템이 불안정해질 가능성이 0이 아니며 이상한 타사 라이브러리가 프로세스 이름 또는 read와 execute kill -9 사이의 시간에 processid가 다른 것으로 변경되어 실수로 의도하지 않은 임의의 프로세스를 종료했습니다.

그러나 매우 고유 한 이름으로 위험과 통제를 이해하고 몇 번의 트랜잭션 삭제 또는 가끔 데이터 손상이 발생하면 99.9 %가 괜찮을 것입니다. 문제가있는 경우 컴퓨터를 재부팅하고 프로세스 충돌이 없는지 확인하십시오. 기술 지원 스크립트가 "컴퓨터를 다시 시작해 보셨습니까?"라는 수준의 코드가 5와 같은 코드이기 때문입니다.


15
이름과 일치하는 프로세스가 없으면 오류가 발생합니다. ps -ef | grep myProcessName | grep -v grep | awk '{print $2}' | xargs -r kill -9인수가 제공되지 않으면 xargs가 명령을 실행하지 않도록하는 데 사용할 수 있습니다 .
Epigene

2
약간의 수정만으로 프로세스 이름을 인용하는 것이 좋습니다. 따옴표가 ps -ef | grep 'myProcessName' | grep -v grep | awk '{print $2}' | xargs -r kill -9 없으면 첫 번째 실행에서 백그라운드 프로세스 중 하나만 종료되었습니다. 그것을 다시 실행하면 나머지는 죽였습니다.
Ali Haider

-r옵션이 OS X에 존재하지 않는 것 같습니다.
Danijel

52

공정 선택시 유연성이 더 필요한 경우

for KILLPID in `ps ax | grep 'my_pattern' | awk ' { print $1;}'`; do 
  kill -9 $KILLPID;
done

grep -e 등을 사용할 수 있습니다.


4
-1 루프가 필요하지 않습니다 kill -9 `ps ax | awk '[m]y_pattern { print $1 }'`. 리팩토링을 참고하십시오. @synthesizerpatel의 답변에 대한 내 의견도 참조하십시오.
tripleee

11
당신의 downvote에 문제 @tripleee,하지만 당신은 OQ는 것을, 실현을 | : "GREP my_pattern 추신 보조 내가 의해 얻을 모든 프로세스를 죽이고 싶어" 나는 dutyfully 가능.
Eugen Rieck

Kill은 모든 프로세스를 한 번에 종료하므로 루프를 수행 할 필요가 없습니다. ps세 개의 프로세스 123, 234 및 345 가 반환 되면 파일 인수 kill 123 234 345와 마찬가지로 rm또는 cat여러 개의 인수 를 사용할 수 있습니다 .
tripleee

@tripleee 내가 제거grep
Eugen Rieck

for KILLPID in 추신 도끼 | grep '푸마'| grep -v 'grep'| awk '{print $ 1;}' ; do kill -9 $KILLPID; done는 grep을 제거합니다
Justin E

18

다음 명령을 사용하여 프로세스를 나열 할 수 있습니다

ps aux | grep -c myProcessName 

해당 프로세스 수를 확인 해야하는 경우 다음을 실행하십시오.

ps aux | grep -c myProcessName |grep -v grep 

그 후 다음을 사용하여 프로세스를 종료 할 수 있습니다

kill -9 $(ps aux | grep -e myProcessName | awk '{ print $2 }') 

다음 명령을 사용하여 프로세스를 나열 할 수 있습니다. ps aux | grep -c myProcessName 해당 프로세스의 수를 확인한 다음 ps aux | grep -c myProcessName | grep -v grep 이후 kill -9 $ (ps aux | grep -e myProcessName | awk '{print $ 2}')를 사용하여 프로세스를 종료 할 수 있습니다.
Nived Thanima

13

또한 사용할 수 있습니다 killall -r my_pattern. -r프로세스 이름 패턴을 확장 정규식으로 해석하십시오.

killall -r my_pattern

8

pkill -f PATTERN약간 위험한 것으로 판단되면 , ezkill bash 스크립트를 작성하여 죽이고 싶은 패턴과 일치하는 프로세스 중에서 선택하는 프로세스를 선택하십시오.


7

다음 명령을 사용하여

kill -9 $(ps aux | grep 'process' | grep -v 'grep' | awk '{print $2}')

4

프로세스 ID를 찾는 데 어려움을 겪지 않으려면 regexp를 사용하여 이름으로 프로세스를 종료하십시오. 예를 들어, 코드를 따라 크롬을 죽이는 것은 속임수입니다.

killall -r --regexp chrome


1
short -r 또는 --regexp GNU long 옵션 인 각각 또는 만 필요합니다 .
BigSmoke

3

다음 명령을 사용하여 다음을 수행 할 수 있습니다.

ps -ef | grep -i myprocess | awk {'print $2'} | xargs kill -9

또는

ps -aux | grep -i myprocess | awk {'print $2'} | xargs kill -9

그것은 나를 위해 작동합니다.


1
StackOverflow에 오신 것을 환영합니다. 코드 행은 코드 블록으로 형식화되도록 4 줄 또는 탭 들여 쓰기를 사용하십시오. 안부
YakovL

2

나쁜 소리?

 pkill `pidof myprocess`

예:

# kill all java processes
pkill `pidof java`

2

지원하지 않는 서버에 가장 적합한 방법을 찾았습니다. pkill

kill -9 $(ps ax | grep My_pattern| fgrep -v grep | awk '{ print $1 }')

반복 할 필요가 없습니다.


1

그것은 사용하는 것이 가장 안전한이다 pgrep -f와 함께 kill, 또는 단지 pkill -f, grep보내고 ps'의 출력은 잘못 될 수 있습니다.

패턴 트릭 ps | grep을 추가 | grep -v하거나 사용하여 grep 라인을 필터링 해야하는 사용 과 달리 pgrep디자인에 따라 선택되지 않습니다.

또한, 사용자의 패턴에 표시됩니다 ps의 ' UID/ USER, SDATE/ START또는 기타 열, 당신은 출력에서 원하지 않는 프로세스를 얻을 그들을 죽일 것 pgrep+ pkill이 결함으로 고생하지 않습니다.

또한 그 발견 killall -r/ -regexp 내 정규 표현식으로 작동하지 않았다.

pkill -f "^python3 path/to/my_script$"

man pkill


0

나는 Eugen Rieck의 대답을 취하여 그것을 사용했습니다. 내 코드는 다음을 추가합니다.

  1. ps ax grep을 포함하므로 grep -Eiv 'grep'
  2. 사람이 읽을 수 있도록 몇 가지 if와 echo를 추가했습니다.

파일 이름을 지정하고 killserver여기에갑니다.

#!/bin/bash
PROCESS_TO_KILL=bin/node
PROCESS_LIST=`ps ax | grep -Ei ${PROCESS_TO_KILL} | grep -Eiv 'grep' | awk ' { print $1;}'`
KILLED=
for KILLPID in $PROCESS_LIST; do
  if [ ! -z $KILLPID ];then
    kill -9 $KILLPID
    echo "Killed PID ${KILLPID}"
    KILLED=yes
  fi
done

if [ -z $KILLED ];then
    echo "Didn't kill anything"
fi

결과

  myapp git:(master) bash killserver
Killed PID 3358
Killed PID 3382
Killed
  myapp git:(master) bash killserver
Didn't kill anything

0

이게 방법이야:

kill -9 $(pgrep -d' ' -f chrome)

3
이 코드는 질문에 대답 할 수 있지만 문제를 해결하는 방법 및 / 또는 이유에 대한 추가 컨텍스트를 제공하면 답변의 장기적인 가치가 향상됩니다.
Igor F.
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.