[regex] 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을 수행 할 수 있어야합니다.

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. 과
  • 우아 하고 비열한, 드문 조합 🙂

답변

당신이 pkill이 있다면

pkill -f csp_build.py

전체 인수 목록 대신 프로세스 이름에 대해서만 grep하려는 경우 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등 (살인 -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"
}


답변

killall -r regexp

-r, --regexp

프로세스 이름 패턴을 확장 정규식으로 해석하십시오.


답변

사용해보십시오

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


답변

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

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

pgrep '^python*' | xargs kill


답변

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

kill -9 `pgrep -f cps_build`

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