bash 및 regex를 사용하여 한 줄로 프로세스 찾기 및 종료


648

프로그래밍 중에 프로세스를 종료해야하는 경우가 종종 있습니다.

내가 지금하는 방법은 다음과 같습니다

[~]$ ps aux | grep 'python csp_build.py'
user    5124  1.0  0.3 214588 13852 pts/4    Sl+  11:19   0:00 python csp_build.py
user    5373  0.0  0.0   8096   960 pts/6    S+   11:20   0:00 grep python csp_build.py
[~]$ kill 5124

프로세스 ID를 자동으로 추출하여 같은 줄에서 죽일 수 있습니까?

이처럼 :

[~]$ ps aux | grep 'python csp_build.py' | kill <regex that returns the pid>

3
나를 믿어! : 'D 당신이 선택한 첫 번째 대답은 당신이 당신의 대답에서 말한 해결책보다 훨씬 더 복잡합니다. 차라리 당신의 길을 고르겠습니다.
Santosh Kumar

검사에 가장 좋은 방법은 프로세스가있는 경우 : stackoverflow.com/questions/3043978/...
트레버 보이드 스미스

답변:


1398

에서 다음 bash을 수행 할 수 있어야합니다.

kill $(ps aux | grep '[p]ython csp_build.py' | awk '{print $2}')

작동에 대한 자세한 내용은 다음과 같습니다.

  • 그만큼 ps 당신에게 모든 프로세스의 목록을 제공합니다.
  • grep검색 문자열을 기반으로 하는 필터 [p]는 실제 검색 을 중지시키는 속임수입니다.grep 프로세스 자체 입니다.
  • 그만큼 awk 은 각 줄의 두 번째 필드 인 PID입니다.
  • $(x)구조체 수단 실행할 x다음 출력을 받아 그 명령 행 입었다. ps위의 구문 내 에서 해당 파이프 라인 의 출력은 프로세스 ID 목록이므로 결국 같은 명령으로 끝납니다 kill 1234 1122 7654.

다음은 그 내용을 보여주는 대본입니다.

pax> sleep 3600 &
[1] 2225
pax> sleep 3600 &
[2] 2226
pax> sleep 3600 &
[3] 2227
pax> sleep 3600 &
[4] 2228
pax> sleep 3600 &
[5] 2229
pax> kill $(ps aux | grep '[s]leep' | awk '{print $2}')
[5]+  Terminated              sleep 3600
[1]   Terminated              sleep 3600
[2]   Terminated              sleep 3600
[3]-  Terminated              sleep 3600
[4]+  Terminated              sleep 3600

모든 침목이 끝나는 것을 볼 수 있습니다.


grep '[p]ython csp_build.py'비트를 좀 더 자세히 설명하면 다음과 같습니다.

당신은 않을 경우 sleep 3600 &다음 ps -ef | grep sleep, 당신이하는 경향 이 개 와 프로세스 sleep그것에서, sleep 3600그리고 grep sleep그들 모두가 (때문에를sleep 로켓 과학이 아니다 그, 그 (것)들에서).

그러나 ps -ef | grep '[s]leep'그 안에 프로세스를 만들지 sleep않고 대신 grep '[s]leep'여기에 까다로운 비트가 있습니다. grep정규 표현식 "캐릭터 클래스의 모든 문자 [s](즉, s뒤에 오는) "를 찾고 있기 때문에 찾지 못합니다.leep .

즉, 찾고 sleep있지만 grep 프로세스는grep '[s]leep' 에는없는sleep .

내가 이것을 보았을 때 (여기 누군가 여기 있음) 즉시 사용하기 시작했습니다.

  • 추가하는 것보다 프로세스가 적습니다 | grep -v grep. 과
  • 우아 하고 비열한, 드문 조합 :-)

2
@ paxdiablo, 당신은 그것에 대한 링크를 제공 할 수 있습니까? 왜 작동하는지 당황했습니다.
glenn jackman

58
awk- ps aux | awk '/ [b] eam / {print $ 2}' , grep 필요 없음
Yola

20
pgrep 또는 pkill 만 사용하는 것이 좋습니다
NGix

2
한 가지 작은 문제가 있습니다. 프로세스가 이미 종료 된 경우이 라인은 kill표준 출력으로 변경됩니다kill: usage: kill [-s sigspec | -n signum | -sigspec] pid | jobspec ... or kill -l [sigspec]
Lionel Chan

5
대신 grep '[p]ython csp_build.py'다음을 사용할 수도 있습니다 kill $(ps aux | grep 'python csp_build.py' | grep -v grep | awk '{print $2}').. grep -v일치하지 않는 줄을 반환합니다.
usandfriends

138

당신이 pkill이 있다면

pkill -f csp_build.py

전체 인수 목록 대신 프로세스 이름에 대해서만 grep하려는 경우 off로 두십시오 -f.


1
이것을 테스트했을 때 아무 일도 일어나지 않았습니다.
Orjanp

8
pgrep를 먼저 사용하여 올바른 프로세스를 잡았는지 확인하십시오. 그런 다음 올바른 패턴으로 pkill을 다시 사용하십시오.
ghostdog74

18
+1. pgreppkill같은 당신이 알아서로 작업이 제대로 프로세스를 지정합니다. 기본적으로 프로세스 이름 만 일치합니다.이 경우 거의 "파이썬"입니다. pgrep -f "python csp_build.py"전체 명령을 일치시키는 데 사용하십시오 .
mr.spuratic

3
당신은 살인과 강제해야 할 수도 있습니다pkill -9 -f csp_build.py
studgeek

1
이것은 정말로 받아 들여지고 인기가 높은 답변이어야합니다. 모든 어색한 것들이 필요하지 않습니다. 이 페이지를 찾은 사람들이 첫 번째 답변을 넘어 읽기를 바랍니다.
Jason C

89

짧막 한 농담:

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

  • 열 2를 인쇄하십시오. awk '{print $2}'
  • sudo 선택 사항입니다
  • 실행 kill -9 5124, kill -9 5373등 (살인 -15 약간 느린 더 우아한 만입니다)

보너스:

또한 내 .bash_profile에 2 개의 바로 가기 기능이 정의되어 있습니다 (~ / .bash_profile은 osx 용이며 * nix 시스템에서 작동하는 것을 확인해야합니다).

  1. p 키워드
    • 모든 P를 나열 키워드가 포함 rocesses
    • 사용 예 : : p csp_build, p python

bash_profile 코드 :

# FIND PROCESS
function p(){
        ps aux | grep -i $1 | grep -v grep
}
  1. 키워드
    • K는 이 키워드가 LL 프로세스를
    • 사용법 예 : ka csp_build,ka python
    • 선택적 킬 레벨 예 : ka csp_build 15,ka python 9

bash_profile 코드 :

# KILL ALL
function ka(){

    cnt=$( p $1 | wc -l)  # total count of processes found
    klevel=${2:-15}       # kill level, defaults to 15 if argument 2 is empty

    echo -e "\nSearching for '$1' -- Found" $cnt "Running Processes .. "
    p $1

    echo -e '\nTerminating' $cnt 'processes .. '

    ps aux  |  grep -i $1 |  grep -v grep   | awk '{print $2}' | xargs sudo kill -klevel
    echo -e "Done!\n"

    echo "Running search again:"
    p "$1"
    echo -e "\n"
}

알림 -새 기능을로드하기 위해 bash 쉘 (터미널)을 다시 시작하는 것을 잊지 마십시오. 또는 source ~/.bash_profile현재 셸에서 실행 하여 새 기능을 가져옵니다 (이것이 내가 선호하는 것임).
a20

다른 많은 답변과 마찬가지로 이것은 쓸모없는 사용으로grep 인해 엄청난 고통을 겪습니다 . 다음과 같이 grep x | awk '{ y }'awk '/x/ { y }'
바꾸면

1
@tripleee 연결하려는 웹 사이트가 귀하의 것입니까? 다양한 의견 섹션에 링크되어 있습니다. SEO를 구축하려고하십니까?
a20

아니요, SEO에 관심이 없습니다. 인식을 쌓고 싶습니다.
tripleee 2012 년

1
.. 마치 마치 권위있는 기관인 것처럼 웹 사이트에 연결하여. 좋은. 또한 grep이 빠릅니다 .
a20


15

사용해보십시오

ps aux | grep 'python csp_build.py' | head -1 | cut -d " " -f 2 | xargs kill

조금 바꿔야했습니다. 이것은 효과가 있었다. 감사. :) ps aux | grep 'python csp_build.py'| 헤드 -1 | cut -d ""-f 5 | xargs kill
Orjanp

3
ps aux | grep 'python csp_build.py' | awk '{print $2}' | xargs kill나를 위해 일했다. 고맙습니다
Rasika Perera

아이들은 Awk가 할 수있는 모든 것을 grep할 수 있다는 것을 기억하십시오 . 사소한 경우 grep x y | awk '{ z }'는 항상 더 잘 작성 됩니다. awk '/x/ { z }' y또한 쓸모없는 사용을grep 참조하십시오 .
tripleee

11

당신은 단지 사용할 수 있습니다 pkill '^python*'정규식 프로세스 종료 .

죽이기 전에 무엇을 죽이거나 찾을 것인지 보려면 pgrep -l '^python*'where -l outputs 프로세스 이름을 사용하십시오. 을 사용하지 않으려면 다음을 사용하십시오 pkill.

pgrep '^python*' | xargs kill


8

pgrep 사용-많은 플랫폼에서 사용 가능 :

kill -9 `pgrep -f cps_build`

pgrep -f는 "cps_build"와 일치하는 모든 PID를 반환합니다


2
당신이 가지고 있다면 pgrep, 당신도 가질 것 pkill입니다. 항상 (기본값) 또는 작동 하지 않는 이유를 모르면 사용kill -9 하지 마십시오 . kill -15kill -2
tripleee

이것은 @nathanael의 대답 을 잘못 표현한 것처럼 보이며 잘못 지시 된 것을 생략 -9하고 적절한 최신 명령 대체 구문을 사용합니다. 대신 찬성하라. 물론 pkill대답 은 여전히 ​​낫습니다.
tripleee

@tripleee이 경우 kill -9는 내가 원하는 것입니다. 모든 위반자를 극단적 인 편견으로 종료하십시오. 또한 몇 년 동안 아무런 문제없이 kill -9를 사용했습니다. 제 생각에는 항상 순수 주의자 캠프와 겟-투스-완료된 현실 주의자 캠프가있을 것입니다.
a20

"이유를 모른다면"부분을 놓치셨습니까? 나는 모든 일을 끝내는 것이지만, 이것이 -9실제로 의미 하는 바를 이해할 때까지 발로 자신을 쏘는 일반적인 방법 중 하나입니다 .
tripleee

@tripleee 안녕하세요 tripleee, 나는 최근에 당신이 옳다는 것을 알았습니다. 살인 -15가 응용 프로그램이 우아하게 죽일 수있는 기회를주기 때문에 더 나은 선택입니다. 이에 따라 코드를 변경했습니다. stackoverflow.com/a/30486159/163382
a20

7

이것은 pid 만 반환합니다.

pgrep -f 'process_name'

따라서 한 줄에 모든 프로세스를 종료하려면

kill -9 $(pgrep -f 'process_name')

또는 프로세스의 정확한 이름을 알고 있다면 pidof를 시도 할 수도 있습니다.

kill -9 $(pidof 'process_name')

그러나 프로세스의 정확한 이름을 모르면 pgrep더 좋습니다.

동일한 이름으로 여러 프로세스가 실행 중이고 첫 번째 프로세스를 종료하려는 경우 :

kill -9 $(pgrep -f 'process_name' | head -1)

또한 대소 문자 구분이 걱정된다면 grep에서와 같이 -i 옵션을 추가 할 수 있습니다. 예를 들면 다음과 같습니다.

kill -9 $(pgrep -fi chrome)

에서 신호와 pgrep을에 대한 자세한 정보 man 7 signal또는 man signalman pgrep


5

당신은 awk와 backtics로 그것을 할 수 있습니다

ps auxf |grep 'python csp_build.py'|`awk '{ print "kill " $2 }'`

awk에서 $ 2는 열 2를 인쇄하고, 백틱은 인쇄 된 명령문을 실행합니다.

그러나 훨씬 깨끗한 솔루션은 파이썬 프로세스가 프로세스 ID를 / var / run에 저장 한 다음 해당 파일을 읽고 죽일 수 있습니다.


그러면 프로세스 5124와 5373을 모두 죽이지 않습니까? 나는 이것이 문제가되지 않는다고 생각한다.
Orjanp

문제가되지는 않지만 grep 프로세스를 제외하기 위해 항상 다른 grep을 추가 할 수 있습니다. grep과 awk 사이의 "grep -v grep"
Alexander Kjäll

약간 수정 된 명령으로 테스트했습니다. 그러나 그것은 프로세스를 죽이지 않았고, kill <pid> 만 인쇄했습니다. PS AUXF | grep '[p] ython csp_build.py'| awk '{print "kill"$ 2}'
Orjanp

인쇄 "kill"$ 2 문을 시스템 ( "kill"$ 2)과 바꾸는 데만 필요했습니다. 그런 다음 작동합니다. :)
Orjanp

5

내 작업은 특정 디렉토리에있는 정규 표현식과 일치하는 모든 것을 죽였습니다 (셀레늄 테스트 후 모든 것이 멈추지 않았습니다). 이것은 나를 위해 일했다 :

for i in `ps aux | egrep "firefox|chrome|selenium|opera"|grep "/home/dir1/dir2"|awk '{print $2}'|uniq`; do kill $i; done

-9의 옵션은 kill아마 너무 공격적이다. 그들이 자원을 자유롭게 할 수는 없습니다.
Birei

좋은! 둘 이상의 일치 프로세스가있을 수 있다는 사실을 고려하는 유일한 사람! 작은 참고 사항 : 아마도 grep 프로세스 자체가 프로세스 목록에 표시되지 않도록 파이프에 "grep -v grep"또는 이와 유사한 것을 추가 할 수 있습니다.
Brad Parks

kill여러 프로세스를 허용하므로 루프는 기본적으로 쓸모가 없습니다. 이 페이지의 다른 곳에서 언급했듯이 프로세스가 응답하지 않는다는 것을 알지kill -9 못하면 사용해서는 안됩니다 . kill
tripleee

-9를 제거하는 것은 그리 중요하지 않습니다. 답변을 더 잘 편집했습니다.
서지

5

키워드로 프로세스를 종료하려면 midori예를 들면 다음과 같습니다.

kill -SIGTERM $(pgrep -i midori)


3

awk(및 ps) 만 사용하는 방법 :

ps aux | awk '$11" "$12 == "python csp_build.py" { system("kill " $2) }'

문자열 평등 테스트를 사용하면이 프로세스 자체와 일치하지 않습니다.


어떤 이유로 나는 "python csp_build.py"에 적중하지 않습니다. 그러나 "파이썬"만 명중됩니다.
Orjanp

3
ps -o uid,pid,cmd|awk '{if($1=="username" && $3=="your command") print $2}'|xargs kill -15

일일 한도 때문에 +1 할 수 없지만 option ps과 함께 사용 하면 -o사용할 가치가 있습니다.
P Shved

ps는 나에게 많은 것을주지 않습니다. [~] $ ps PID TTY TIME CMD 6365 pts / 6 00:00:00 ps 29112 pts / 6 00:00:00 bash
Orjanp

3

pkill에 -f 부여

pkill -f /usr/local/bin/fritzcap.py

.py 파일의 정확한 경로는

# ps ax | grep fritzcap.py
 3076 pts/1    Sl     0:00 python -u /usr/local/bin/fritzcap.py -c -d -m

2

나는 다음과 같은 것을 사용하기 시작했다.

kill $(pgrep 'python csp_build.py')

1

일반적인 PPID 에서 시작한 자체 프로세스를 죽이는 것은 매우 빈번 합니다. 깃발 과 관련된 pkill–P 은 저에게 승자입니다. @ ghostdog74 예제 사용 :

# sleep 30 &                                                                                                      
[1] 68849
# sleep 30 &
[2] 68879
# sleep 30 &
[3] 68897
# sleep 30 &
[4] 68900
# pkill -P $$                                                                                                         
[1]   Terminated              sleep 30
[2]   Terminated              sleep 30
[3]-  Terminated              sleep 30
[4]+  Terminated              sleep 30

1

ps에 대한 사용자 스위치가 필요하지 않습니다.

kill `ps ax | grep 'python csp_build.py' | awk '{print $1}'`

1

어떤 경우에는 다음과 같이 킬 프로세스를 동시에 수행하고 싶습니다.

➜ ~ 수면 1000 &
[1] 25410
➜ ~ 수면 1000 &
[2] 25415
➜ ~ 수면 1000 &
[3] 25421
➜ ~ pidof 수면
25421 25415 25410
pid ~`pidof sleep`을 죽여라
[2]-25415 수면 종료 1000                                                             
[1]-25410 수면 종료 1000
[3] + 25421 수면 종료 1000

그러나 귀하의 경우에는 약간 부적절하다고 생각합니다 (파이썬 a, 파이썬 b, 파이썬 x ... 백그라운드에서 실행 중일 수 있습니다).


1

경우 pkill -f csp_build.py프로세스를 종료하지 않습니다 당신은 추가 할 수 있습니다 -9무시되지 않습니다 킬 (kill) signall을 보낼 수 있습니다. 즉pkill -9 -f csp_build.py


1

해결책 은 정확한 pattern으로 프로세스를 필터링하고 pid를 구문 분석하며 kill 프로세스를 실행하기위한 인수 목록을 구성하는 것입니다.

ps -ef  | grep -e <serviceNameA> -e <serviceNameB> -e <serviceNameC> |
awk '{print $2}' | xargs sudo kill -9

문서에서 설명 :

ps 유틸리티는 제어 터미널이있는 모든 프로세스에 대한 정보를 포함하는 행 다음에 헤더 행을 표시합니다.

-e 다른 사용자의 프로세스를 포함한 정보를 표시합니다.

-f uid, pid, parent pid, 최근 CPU 사용량, 프로세스 시작을 표시합니다.

그렙 모든 입력 파일을 제공 유틸리티를 검색, 선택 선이

-e pattern, --regexp = pattern 입력을 검색하는 동안 사용되는 패턴을 지정합니다. 지정된 패턴과 일치하면 입력 행이 선택됩니다. 이 옵션은 여러 개의 -e 옵션을 사용하여 여러 패턴을 지정하거나 패턴이 대시 (`- ​​')로 시작할 때 가장 유용합니다.

xargs- 인수 목록 구성 및 유틸리티 실행

죽일 - 종료 또는 프로세스 신호

번호 9 신호 - KILL (비 잡을 비 무시할 명)

:

ps -ef  | grep -e node -e loggerUploadService.sh - -e applicationService.js |
awk '{print $2}' | xargs sudo kill -9

0

나는 스크립트가 슬램되고 CPU bashing 일 때 Firefox를 죽이기 위해 이것을 사용합니다 :) 'Firefox'를 죽고 싶은 앱으로 바꿉니다. Bash 쉘에 있습니다-OS X 10.9.3 Darwin.

kill -Hup $(ps ux | grep Firefox | awk 'NR == 1 {next} {print $2}' | uniq | sort)


교체 grep Firefox | awk 'NR == 1 { next } ...'awk 'NR == 1 || $11 !~ /Firefox/ { next } ...' 뿐만 아니라하는 과정을 절약 할뿐만 아니라 정밀도를 향상시킨다. sort | uniq순수한 Awk에서 제거하는 것은 어렵지 않습니다 (물론 uniq | sort잘못된 것입니다-인접하지 않은 중복을 놓치고 불필요하게의 출력 을 정렬하여 오류를 숨기십시오 uniq).
tripleee

0

내가 사용 gkill processnamegkill는 다음 스크립트입니다 :

cnt=`ps aux|grep $1| grep -v "grep" -c`
if [ "$cnt" -gt 0 ]
then
    echo "Found $cnt processes - killing them"
    ps aux|grep $1| grep -v "grep"| awk '{print $2}'| xargs kill
else
    echo "No processes found"
fi

참고 : 명령 줄에 "grep"이있는 프로세스는 종료되지 않습니다.


1
야크 창고의 많은 다른 많은 재창조와 마찬가지로, 이것은 쓸모없는 사용grep 과 다른 일반적인 쉘 스크립트 반 패턴으로 가득 차 있습니다 .
tripleee

-1

다음 명령이 유용합니다.

kill $(ps -elf | grep <process_regex>| awk {'print $4'})

예를 들어 ps -elf | grep top

    0 T ubuntu    6558  6535  0  80   0 -  4001 signal 11:32 pts/1    00:00:00 top
    0 S ubuntu    6562  6535  0  80   0 -  2939 pipe_w 11:33 pts/1    00:00:00 grep --color=auto top

kill -$(ps -elf | grep top| awk {'print $4'})

    -bash: kill: (6572) - No such process
    [1]+  Killed                  top

프로세스가 여전히 중단 된 경우 다음과 같이 "-9"확장자를 사용하여 강제 종료하십시오.

kill -9 $(ps -elf | grep top| awk {'print $4'})

희망이 도움이됩니다 ...!


-1

bash에서 한 줄로 모든 프로세스를 찾아서 종료하십시오.

kill -9 $(ps -ef | grep '<exe_name>' | grep -v 'grep' | awk {'print $2'})
  • ps -ef | grep '<exe_name>'-패턴과 일치하는 실행중인 프로세스 세부 사항 (uname, pid 등) 목록을 제공합니다. 출력 목록에는이 grep명령도 검색됩니다. 이제 죽이기 위해서는이 grep명령 과정 을 무시해야합니다 .
  • ps -ef | grep '<exec_name>' | grep -v 'grep'-다른 grep을 추가 -v 'grep'하면 현재 grep 프로세스 가 제거됩니다.
  • 그런 다음 사용 awk하여 프로세스 ID 만 가져옵니다.
  • 그런 다음이 명령을 내부에 유지하고 명령에 $(...)전달하여 kill모든 프로세스를 종료하십시오.

-1

아래 명령을 사용하여 명령의 pid를 나열 할 수 있습니다. 리눅스에서 모든 프로세스를 보려면 top을 사용하거나 더 잘 사용하십시오. 여기서는 이름이 지정된 프로세스를 종료하고 싶습니다

ps -ef | grep '/usr/lib/something somelocation/some_process.js'  | grep -v grep | awk '{print $2}'

그리고 pid를 확인하십시오. 그들을 죽이려면 kill 명령을 사용하십시오.

sudo kill -9 `ps -ef | grep '/usr/lib/something somelocation/some_process.js'  | grep -v grep | awk '{print $2}'`

예 :-는 htop 프로세스 목록에 있습니다.

sudo kill -9 `ps -ef | grep '<process>'  | grep -v grep | awk '{print $2}'`

이것은 내 문제를 해결합니다. 실수로 프로세스를 종료 한 경우 항상 프로세스를 다시 시작할 수 있도록 준비하십시오.

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