programing

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

iphone6s 2023. 5. 2. 22:26
반응형

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

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

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

[~]$ 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>

bash질문에(1) 나열된 기본 도구만 사용하여 다음 작업을 수행할 수 있습니다.

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' 만들지 grep로처리로 합니다.sleep대신 명령을 사용하여 하나를 만듭니다.grep '[s]leep'그리고 여기 까다로운 부분이 있습니다.grep는 "의 문자라는 정규 문자를 수 없습니다.[s]으로 정의(기로적으정다니합당본기다whichs에 ) 에뒤leep.

다른 말로 하자면, 그것은 그것을 찾는 것입니다.sleep은 하만그렙과정은지▁is과은▁but.grep '[s]leep'sleep그 안에

제가 이것을 (여기 SO에 있는 누군가에 의해) 보여졌을 때, 저는 즉시 그것을 사용하기 시작했습니다.

  • 추가하는 것보다 프로세스가 하나 더 적습니다.| grep -v grep그리고
  • 우아하고 교활한, 희귀한 조합입니다 :-)

(1) 기본적인 도구를 사용하는 에 국한되지 않는다면, 좋은 점이 있습니다.pgrep특정 기준에 따라 프로세스를 찾는 명령입니다(물론 시스템에서 사용 가능한 프로세스가 있는지 여부).

예를 들어 다음을 사용할 수 있습니다.pgrep sleep ID를 출력합니다.sleep명령(기본적으로 프로세스 이름과 일치함). 전체 과 같이 .ps당신은 다음과 같은 것을 할 수 있습니다.pgrep -f 'sleep 9999'.

별도로, 만약 당신이 그렇게 한다면, 그것은 스스로 나열되지 않습니다.pgrep pgrep따라서 위에 표시된 까다로운 필터 방법은 이 경우에 필요하지 않습니다.

를 사용하여 프로세스가 관심 있는 프로세스인지 확인할 수 있습니다.-a전체 프로세스 이름을 표시합니다. 사용자 사용자 로할 수 .-u또는-U 내용은 다음을 하십시오.man을 찾는 페이지.pgrep/pkill더 많은 옵션을 위해.

관심됩니다. 일만족면관있프표시만다됩니스세로는심하단다표▁you니▁once▁then를 사용할 수 있습니다. 그런 다음 사용할 수 있습니다.pkill모든 프로세스에 신호를 보낼 수 있도록 동일한 매개 변수를 사용합니다.

만약 당신이 pkill을 가지고 있다면,

pkill -f csp_build.py

( 인수 목록 ) 하려면 off를 합니다.-f.

라이너 하나:

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

  • 2도 인쇄:awk '{print $2}'
  • sudo 선택 사항입니다.
  • 려달을 합니다.kill -9 5124,kill -9 5373더 느림) etc (kill -15는 더 느림)

보너스:

또한 .bash_profile에 정의된 두 가지 바로 가기 함수가 있습니다(~/.bash_profile은 osx용이므로 *nix 머신에서 작동하는 것을 확인해야 합니다).

  1. p 키워드
    • 키워드가 포함된 모든 프로세스를 나열합니다.
    • 예: 예사용:):p csp_build,p python

bash_profile 코드:

# FIND PROCESS
function p(){
        ps aux | grep -i $1 | grep -v grep
}
  1. 키워드
    • 키워드가 있는 모든 프로세스를 종료합니다.
    • 예: 예사용:):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"
}
killall -r regexp

-r, --regexp

프로세스 이름 패턴을 확장된 정규식으로 해석합니다.

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)

및 은 다음 웹 사이트를 참조하십시오.man 7 signal또는man signal그리고.man pgrep

사용해 보십시오.

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

다음만 사용할 수 있습니다.pkill '^python*'정규식 프로세스 살인에 사용됩니다.

보고 , ▁use를 사용하세요.pgrep -l '^python*'여기서 -l은 프로세스의 이름도 출력합니다.사용하지 않으려는 경우pkill다음과 같이 사용:

pgrep '^python*' | xargs kill

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

kill -9 `pgrep -f cps_build`

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

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

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

설명서의 설명:

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

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

-f uid, pid, parent pid, 최근 CPU 사용량, 프로세스 시작 표시

grep 유틸리티는 지정된 입력 파일을 검색하여 다음 행을 선택합니다.

-e pattern, --reggexp=pattern입력 검색 시 사용할 패턴을 지정합니다. 지정된 패턴 중 하나와 일치하는 입력 라인이 선택됩니다.이 옵션은 다중 -e 옵션을 사용하여 여러 패턴을 지정하거나 패턴이 대시('-')로 시작할 때 가장 유용합니다.

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

프로세스를 종료하거나 종료합니다.

9번 신호 - KILL(잡을 수 없는, 무시할 수 없는 킬)

:

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

당신은 어색하고 백틱하게 그것을 할 수 있습니다.

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

2번 열에 2달러를 인쇄하고, 백틱스는 인쇄된 명세서를 실행합니다.

그러나 훨씬 더 깨끗한 솔루션은 파이썬 프로세스가 프로세스 ID를 /var/run에 저장한 다음 해당 파일을 읽고 종료하는 것입니다.

내 작업은 특정 디렉터리에 있는 정규식과 일치하는 모든 것을 죽이는 것이었습니다(셀레늄 테스트 후 모든 것이 중지되지 않았습니다).이것은 저에게 효과가 있었습니다.

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

를 사용하여 를 종료하는 은 다음과 같습니다.midori예:

kill -SIGTERM $(pgrep -i midori)

여기에 많은 좋은 답변들이 있습니다 - 저는 OP가 수락한 답변을 사용했습니다.다음에 대한 작은 주의 사항을 추가하는 중입니다.pkill그리고.pgrep사용자의 OS 설명서 페이지에서 볼 수 있듯이 일부 OS에서는 프로세스 이름이 15자로 제한됩니다.-f옵션은 내 OS에서 그것을 피할 수 있지만, 나는 그 옵션을 찾을 때까지 곤경에 처했습니다!

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

다음만 사용하는 방법awk)ps):

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

문자열 동등성 테스트를 사용하여 이 프로세스 자체와 일치하지 않도록 합니다.

-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

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

kill $(pgrep 'python csp_build.py')

당신은 ps를 위한 사용자 스위치가 필요하지 않습니다.

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

경우에 따라 다음과 같이 프로세스를 동시에 종료하고 싶습니다.

◦ ~ sleep 1000 &[1] 25410◦ ~ sleep 1000 &[2] 25415◦ ~ sleep 1000 &[3] 25421◦ ~ 잠이 부족한25421 25415 25410◦ ~ '잠 못 이루는 사람'을 죽입니다.- 25415 종료 sleep 1000- 25410 종료 sleep 1000+ 25421 종료 수면 1000

하지만 당신의 경우에는 조금 부적절하다고 생각합니다.(python a, python b, python x를 실행하고 있을 수 있습니다...백그라운드에서.)

bash에서 한 줄로 모든 프로세스를 찾아서 죽입니다.

kill -9 $(ps -ef | grep '<exe_name>' | grep -v 'grep' | awk {'print $2'})
  • ps -ef | grep '<exe_name>'패턴과 일치하는 실행 중인 프로세스 세부 정보(이름, pid 등) 목록을 제공합니다.에는 다음이 됩니다.grep또한 이 명령을 검색합니다.이제 살인에 대해서는 무시할 필요가grep명령 프로세스
  • ps -ef | grep '<exec_name>' | grep -v 'grep'▁grep기로 다른 grep -v 'grep'현재 grep 프로세스를 제거합니다.
  • 다음 용중사를 합니다.awk프로세스 ID만 가져옵니다.
  • 다음 이는 런그다이내보다니관합부에을령명음▁this▁keep▁then▁inside▁command다 안에 보관합니다.$(...) 그것을 다니에합전달다에게 전달합니다.kill명령, 모든 프로세스를 종료합니다.

한다면pkill -f csp_build.py할 수 .-9무시할 수 없는 킬 신호를 보내는 것.pkill -9 -f csp_build.py

용사를 합니다.-Cps

-C cmdlist
     Select by command name.  This selects the processes whose
     executable name is given in cmdlist.

첫 번째 경우, 단순 명령

그래서 만약 당신이 당신의 스크립트를 표준 shebang으로 실행하고 그들을 그의 이름으로 부른다면:

/path/to/csp_build.py

당신은 그들을 찾을 수 있습니다.

ps -C csp_build.py

그렇게

kill $(ps -C csp_build.py ho pid)

충분할지도 모릅니다.

두 번째 경우 cmd 검색

조금 더 강력하지만, 여전히 이 SO 질문의 대부분의 다른 답변보다 훨씬 빠릅니다.

실행 방법을 모르거나 실행 방법을 모르는 경우

python csp_build.py
python3 csp_build.py
python /path/to/csp_build.py

다음을 실행하여 찾을 수 있습니다.

ps -C python,python3,csp_build.py who pid,cmd | grep csp_build.py

다음 용중사를 합니다.sed:

kill $(ps -C python,python3,csp_build.py who pid,cmd |
    sed -ne '/csp_build.py/s/^ *\([0-9]\+\) .*$/\1/p')

https://stackoverflow.com/a/3510879/15603477 답변을 기반으로 합니다.사소한 최적화.

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

을 사용하여tr -s ' '여러 개의 공백(있는 경우)을 1개의 공백으로 압축합니다.

당신이 마주쳤을 때Operation not permitted이것을 따라라 >> https://unix.stackexchange.com/questions/89316/how-to-kill-a-process-that-says-operation-not-permitted-when-attempted .

pkill -f 'PATTERN'

패턴 패턴이 일치하는 모든 프로세스를 종료합니다.-f 옵션을 사용하면 전체 명령줄(즉, 인수 포함)이 고려됩니다.-f 옵션을 사용하지 않으면 명령 이름만 고려됩니다.

공통 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

나는 이것을 스크립트가 중단되고 CPU를 때릴 때 파이어폭스를 죽이기 위해 사용합니다 :) '파이어폭스'를 죽고 싶은 앱으로 대체합니다.저는 Bash 쉘 - OS X 10.9.3 Darwin입니다.

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

사용합니다gkill processname여기서 gkill은 다음 스크립트입니다.

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"가 있는 프로세스는 종료되지 않습니다.

만약 당신이 그것을 대부분 안에서 하고 싶다면.awk, 시도

  for i in $(jot 5); do 
 (python3 -c 'import sys; [ print(_) for _ in sys.stdin ]' ) & done; 
  
  sleep 1; ps aux | {m,g}awk '

       /[p]ython/ { 
              _=(_)" "$2 
       } END { 
           system("echo \47 kill "(_)" \47")
           system(      "kill -9 " _) }'


[302] 14236
[303] 14237
[304] 14238
[305] 14239
[306] 14240
[303]  + suspended (tty input)  ( python3 -c 'import sys; [ print(_) for _ in sys.stdin ]'; )
[305]  + suspended (tty input)  ( python3 -c 'import sys; [ print(_) for _ in sys.stdin ]'; )
[304]  + suspended (tty input)  ( python3 -c 'import sys; [ print(_) for _ in sys.stdin ]'; )
[302]  + suspended (tty input)  ( python3 -c 'import sys; [ print(_) for _ in sys.stdin ]'; )
[306]  + suspended (tty input)  ( python3 -c 'import sys; [ print(_) for _ in sys.stdin ]'; )
 
 kill  14239 14237 14236 14240 14238 
 
[305]    killed     ( python3 -c 'import sys; [ print(_) for _ in sys.stdin ]'; )
[303]    killed     ( python3 -c 'import sys; [ print(_) for _ in sys.stdin ]'; )
[306]  + killed     ( python3 -c 'import sys; [ print(_) for _ in sys.stdin ]'; )
[304]  - killed     ( python3 -c 'import sys; [ print(_) for _ in sys.stdin ]'; )
[302]  + killed     ( python3 -c 'import sys; [ print(_) for _ in sys.stdin ]'; )

다음 명령을 사용하면 편리합니다.

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'})

그게 도움이 되길...!

나는 순전히 그렙의 맹목적인 결과에 기반한 것들을 죽이는 것을 좋아하지 않습니다 - 만약 내가 실수로 원하는 것 이상으로 일치한다면 어떻게 합니까?

명령줄 순수주의자들이 이 문제에 대해 반대표를 던질 것이라는 것을 알고 있지만, 저는 pick(apt-get install pick)과 같은 대화형 필터를 선호합니다.이런 종류의 도구를 사용하면 입력할 때 필터링된 결과가 표시되므로 Enter 키를 누르면 무엇이 죽는지 정확하게 확인할 수 있습니다.

따라서 원라이너는

function killpick { ps ax | pick -q "$1" | awk  '{print $1}' | xargs kill -9; }

killpick은 선택적 인수가 필터의 시작 문자열을 제공하는 것과 함께 증분 필터링을 사용하는 선택자를 제공합니다.

언급URL : https://stackoverflow.com/questions/3510673/find-and-kill-a-process-in-one-line-using-bash-and-regex

반응형