Recommanded Free YOUTUBE Lecture: <% selectedImage[1] %>

kill 시스템 명령을 이용한 프로세스 모니터링

kill(1)명령을 이용하면, 프로세스에 시그널을 보낼 수 있다는 것을 알고 있을 것이다. kill은 인자로 시그널 번호와 시그널을 받을 프로세스의 PID를 받는데, 이때 시그널 번호를 0 으로 할경우 프로세스가 존재하는 지를 검사할 수 있다.

시그널번호 0은 실제 시그널을 보내진 않고, 시그널을 받을 프로세스가 존재하는지만을 검사한다. 만약 프로세스가 존재한다면 0을 리턴하고, 그렇지 않다면 1을 리턴한다.

$ echo $$
4336
$ kill -0 $$
$ echo $?
0
$$는 쉘에서의 특수변수로 쉘 자신의 PID값을 가지고 있다. 그러므로 -0 옵션을 이용해서 검사를 하게 될경우 쉘 프로세스가 존재하고 있으므로 0을 리턴하게 될 것이다. $?는 가장 최근 종료된 프로세스의 리턴값을 가지고 있는 특수변수다.

이제 존재하지 않는 프로세스를 검사해보자.
$ kill -0 12345
bash: kill: (1234) - No such process
$ echo $?
1

예제 쉘 프로그램

#!/bin/sh

# 인자로 검사할 프로세스의 PID를 넘겨 받는다.
CheckPID=$1;

while [ 1 ]
do

kill -0 $CheckPID 2> /dev/null
if [ $? -eq 0 ]
then
  echo "Process Alive"
else
  echo "Process Dead"
fi
sleep 1;

done

예제 C 프로그램

리눅스는 kill(2) 시스템 함수를 제공한다. 이 함수는 두번째 인자로 시그널번호를 넘겨 받는데, 0을 설정하면 시그널을 보내지 않고 프로세스가 존재하는지만을 검사한다. 프로세가 존재하면 0 그렇지 않으면 0이 아닌 정수를 리턴한다.

다음은 위의 쉘프로그램의 C 버전이다.
#include <signal.h>
#include <unistd.h>
#include <stdio.h>

int main(int argc, char **argv)
{
  int status;
  int CheckPID = atoi(argv[1]);

  while(1)
  {
    status = kill(CheckPID, 0);
    if (status)
    {
      printf("Process is Dead\n");
    }
    else
    {
      printf("Process is Alive\n");
    }
    sleep(1);
  }
}