본문 바로가기

IT/리눅스

쉘스크립트로 특정 python 실행 프로세스 죽이기(killall, kill, pgrep)

반응형

ps로 프로세스를 확인했을때 아래와 같이 표시되는 프로세스를 어떻게 제거할 수 있을까 ?

 

root 239033 1 99 13:58 pts/5 00:00:04 python3 audio_data.py 

 

위같은 경우는 프로세스이름이 python3 이기 때문에 

 

killall python3 

명령어로 죽일수 있으나... 동작중인 다른 python3 프로세스도 다 죽여버리는 결과가 생깁니다. 

 

특정 스크립트나 경로를 가진 프로세스만 종료하고 싶은 경우 killall은 그런 세밀한 제어를 제공하지 않기 때문에 이 경우, 프로세스의 PID(프로세스 ID)를 사용하여 개별 프로세스를 종료할 수 있습니다. 예를 들어, 위에서 보여준 프로세스의 PID는 239033입니다. 이 프로세스를 종료하려면 다음과 같이 kill 명령어를 사용할 수 있습니다:

 

kill -9 239033

 

하지만 지금 원하는건 이런게 아닙니다. 

 

여러개의 파이썬 실행 중에 죽이고 싶은 그놈만 찾아서 제거하는 것이지요

 

1. ps와 pgrep을 이용하여 죽이고 싶은 프로세스의 pid를 얻어오기

 

 

ps 명령어로 모든 프로세스의 리스트를 가져온 후, grep 명령어로 특정 스크립트를 실행하는 프로세스를 필터링할 수 있습니다. 이때, grep 결과에서 grep 프로세스 자체를 제외하기 위해 grep -v grep을 사용합니다. 

 

pid=$(ps aux | grep 'audio_data.py' | grep -v grep | awk '{print $2}')
echo $pid

 

 

이 스크립트는 다음과 같이 작동합니다:


ps aux는 시스템의 모든 실행 중인 프로세스에 대한 상세 정보를 출력합니다.
grep 'audio_data.py'는 그 출력 중에서 audio_data.py를 포함하는 줄을 필터링합니다.
grep -v grep는 grep 명령어 자체에 의해 생성된 출력을 제거합니다.
awk '{print $2}'는 필터링된 출력에서 두 번째 컬럼 (PID)만을 선택하여 출력합니다.

 

자 이제 원하는 pid 를 찾았으니 날려버리면 됩니다.

 

 
 
pid=$(ps aux | grep 'audio_data.py' | grep -v grep | awk '{print $2}')
echo $pid
kill -9 $pid
 
 

 

깔끔!!

 

반응형