Profile picture

[Linux] 이름으로 Process ID 가져오기 - pidof

JaehyoJJAng2023년 06월 03일

pidof

Process ID (PID)는 lsofkill 등의 프로세스 관련 명령어를 사용할 떄 필수 옵션이다.

시스템을 운영하다 보면 for-exec 으로 묶인 부모-자식 관계를 가진 여러 프로세스들의 ID 정보가 필요한 경우가 종종 있다.

예를 들어보자면, apache httpd를 실행하면 동일한 이름으로 여러 프로세스가 생성되는데, 이 떄 httpd 라는 이름을 가진 모든 프로세스 ID를 가져오고 싶지만 실행 중인 프로세스 정보를 표시하는 ps 명령어는 이름으로 PID를 가져올 수 있는 방법이 없다.

어떻게든 가져온다면 아래처럼 가져올 수는 있긴하다.

$ ps -aux | grep 'httpd' | grep -v 'grep' | awk '{print $2}'

하지만 pidof 명령어를 사용하면 위처럼 길게 파이프를 연결해서 사용할 필요가 없어진다.


사용법은 pidof <name> 처럼 pidof 명령어 뒤에 PID를 가져올 이름을 인자로 넘겨주면 된다.
아래 예시는 현재 실행한 nginx 프로세스의 모든 PID를 출력하도록 하는 예시이다.

$ pidof nginx
28 1

하나의 pid만 출력

-s 옵션을 주면 하나의 pid만 리턴한다.

$ pidof -s nginx
28

script 실행하는 pid 정보

Shell Script를 작성하여 시스템에 동작시키는 경우가 한 번쯤은 있었을 것이다.

예를 들면, 시스템 내의 디스크 사용량을 감시하는 셸 스크립트가 서버내에 동작하고 있을 때, 이제 모니터링 도구를 서버 내에 도입하게 되어 동작중인 감시 스크립트가 더 이상 쓸모 없게되면 해당 스크립트를 종료(KILL)해야 할 것이다.

그러면 해당 스크립트를 종료하기 위해 어떻게 해야할까? 우선 스크립트의 PID 정보를 알아야 한다.

$ ps -aux | grep '<스크립트이름' | grep -v 'grep' | awk '{print $2}'

위와 같은 방식으로 가져와야 할까? 이렇게도 가져올 수는 있지만 위에서 배운 pidof로 간단하게 PID만 빼올 수 있다. -x 옵션 뒤에 스크립트 명을 주면 특정 스크립트를 실행하는 shell의 PID만 빼올 수 있다.

$ pidof -x run.sh

kill과 연결

pidof 로 가져온 모든 프로세스 ID에 kill 커맨드로 시그널 전송이 가능하다.

$ kill -KILL "$(pidof nginx)"

Loading script...