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 머신에서 작동하는 것을 확인해야 합니다).
- p 키워드
- 키워드가 포함된 모든 프로세스를 나열합니다.
- 예: 예사용:):
p csp_build,p python
bash_profile 코드:
# FIND PROCESS
function p(){
ps aux | grep -i $1 | grep -v grep
}
- 카 키워드
- 이 키워드가 있는 모든 프로세스를 종료합니다.
- 예: 예사용:):
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
용사를 합니다.-C의 ps
-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
'programing' 카테고리의 다른 글
| 워크북 닫기 시 Excel VBA에서 클립보드 프롬프트 사용 안 함 (0) | 2023.05.02 |
|---|---|
| pathlib의 절대 경로를 얻는 방법.경로 객체? (0) | 2023.05.02 |
| Xcode 9.3, .xcworkspace/xcshareddata/IDEWorkspaceChecks.plist에서 새로 생성된 파일을 커밋해야 합니까? (0) | 2023.05.02 |
| "위치: 절대" 요소의 중심을 잡는 방법 (0) | 2023.04.27 |
| SQL Server 2008 Management Studio에서 텍스트 또는 막대(MAX) 열의 전체 내용을 보려면 어떻게 합니까? (0) | 2023.04.27 |