답변:
pkill -f
명령 줄의 모든 부분에 대한 패턴과 일치하는을 사용하십시오 .
pkill -f my_pattern
pkill
. 가장 일반적인 실수는 주어진 시간에 각 바이너리의 인스턴스 하나만 존재할 수 있다는 가정입니다.
killall -m my_pattern
합니다.
pgrep
먼저 무엇을 죽일 것인지 확인하는 것이 좋습니다 . pgrep -l
프로세스 이름 pgrep -a
을 보거나 전체 명령 행을 보는 데 사용할 수 있습니다 . pkill과 동일한 플래그를 사용합니다. 따라서이 경우을 사용할 수 있습니다 pgrep -fa my_pattern
.
ps -ef | grep 'myProcessName' | grep -v grep | awk '{print $2}' | xargs -r kill -9
이 코드는 무엇을하고 있습니까?
는 ps -ef
이 사용자에게 표시 컴퓨터에서 처리 ID의 목록을 생성합니다. 파이프 그렙은 해당 문자열이 포함 된 행을 필터링합니다. 는 grep -v grep
grepping을 수행하는 과정 자체에 일치하지 않는 말했다. 파이프 awk 인쇄는 기본 구분 기호 공백의 행을 분할하고 프로세스 ID 인 두 번째 열로 필터링한다고 말합니다. 파이프 xargs는 모든 pid를 보내기 위해 새로운 프로세스를 시작하여 kill -9
끝납니다.
위의 코드는 몇 가지 이유로 나쁘고 위험하며 추악하고 해킹 적입니다.
강제 종료되는 코드가 확률이 낮은 경쟁 조건으로 데이터베이스 운영 또는 보안 트랜잭션을 수행하는 경우 시간의 일부, 시간의 일부, 해당 트랜잭션의 원 자성이 손상되어 정의되지 않은 동작이 생성됩니다. kill -9는 죄수를 취하지 않습니다. 코드가이 코드에 민감한 경우 xargs kill
부품을 정상적인 종료를 요청하는 전송 된 플래그로 교체하고 해당 요청이 거부 된 경우에만kill -9
실수로 운영 체제를 종료하거나 관련이없는 프로세스에서 정의되지 않은 동작을 일으켜 ps -ef
존재하는 모든 가능한 프로세스를 나열 하기 때문에 전체 시스템이 불안정해질 가능성이 0이 아니며 이상한 타사 라이브러리가 프로세스 이름 또는 read와 execute kill -9 사이의 시간에 processid가 다른 것으로 변경되어 실수로 의도하지 않은 임의의 프로세스를 종료했습니다.
그러나 매우 고유 한 이름으로 위험과 통제를 이해하고 몇 번의 트랜잭션 삭제 또는 가끔 데이터 손상이 발생하면 99.9 %가 괜찮을 것입니다. 문제가있는 경우 컴퓨터를 재부팅하고 프로세스 충돌이 없는지 확인하십시오. 기술 지원 스크립트가 "컴퓨터를 다시 시작해 보셨습니까?"라는 수준의 코드가 5와 같은 코드이기 때문입니다.
ps -ef | grep myProcessName | grep -v grep | awk '{print $2}' | xargs -r kill -9
인수가 제공되지 않으면 xargs가 명령을 실행하지 않도록하는 데 사용할 수 있습니다 .
ps -ef | grep 'myProcessName' | grep -v grep | awk '{print $2}' | xargs -r kill -9
없으면 첫 번째 실행에서 백그라운드 프로세스 중 하나만 종료되었습니다. 그것을 다시 실행하면 나머지는 죽였습니다.
-r
옵션이 OS X에 존재하지 않는 것 같습니다.
공정 선택시 유연성이 더 필요한 경우
for KILLPID in `ps ax | grep 'my_pattern' | awk ' { print $1;}'`; do
kill -9 $KILLPID;
done
grep -e 등을 사용할 수 있습니다.
kill -9 `ps ax | awk '[m]y_pattern { print $1 }'`
. 리팩토링을 참고하십시오. @synthesizerpatel의 답변에 대한 내 의견도 참조하십시오.
ps
세 개의 프로세스 123, 234 및 345 가 반환 되면 파일 인수 kill 123 234 345
와 마찬가지로 rm
또는 cat
여러 개의 인수 를 사용할 수 있습니다 .
grep
for KILLPID in
추신 도끼 | grep '푸마'| grep -v 'grep'| awk '{print $ 1;}' ; do kill -9 $KILLPID; done
는 grep을 제거합니다
다음 명령을 사용하여 프로세스를 나열 할 수 있습니다
ps aux | grep -c myProcessName
해당 프로세스 수를 확인 해야하는 경우 다음을 실행하십시오.
ps aux | grep -c myProcessName |grep -v grep
그 후 다음을 사용하여 프로세스를 종료 할 수 있습니다
kill -9 $(ps aux | grep -e myProcessName | awk '{ print $2 }')
그것은 사용하는 것이 가장 안전한이다 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$"
나는 Eugen Rieck의 대답을 취하여 그것을 사용했습니다. 내 코드는 다음을 추가합니다.
ps ax
grep을 포함하므로 grep -Eiv 'grep'
파일 이름을 지정하고 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
my_pattern
단순히 이름의 문자열, 또는 어떤 정규식 특수 문자가 포함되어 있습니까?