메뉴 건너뛰기

XEDITION

Linux

프로세스 관리하는 스크립트

김병수 2019.10.03 18:32 조회 수 : 6

이 프로그램은 프로세스가 떠있는지 검사해서, 떠있지 않을 경우 재실행 시킨다. 프로그램은 perl을 이용해서 작성했다. proc파일시스템을 분석해서, 프로세스 정보를 얻어올 수 있겠지만, 귀찮아서 그냥 ps를 이용했다. thread 갯수를 얻기 위해서 proc 파일시스템을 분석했다.

 

#!/usr/bin/perl

$argnum = $#ARGV+1;
$PNAME = $ARGV[0];
$PID=$$;

# thread(:12) 갯수를 얻어온다.
sub getThreadNum
{
  my($PID) = @_;
  my $PROC = "/proc/$PID/status";
  my $thread="";
  my $line;
  open(LFD, $PROC) || die "Process Status FAILURE |status=0\n";

  while($line=<LFD>)
  {
    if ($line =~ m/^Threads:/)
    {
      $line =~ s/\s+$//;
      @_=split /:[ \t]+/,$line;
      $thread=$_[1];
      close(LFD);
      return atoi($thread);
    }
  }
  close(LFD);
}

# 문자열을 int형 숫자로 변경한다.
sub atoi
{
    my $num;
    foreach my $d (split(//, shift()))
    {
        $num = $num * 10 + $d;
    }
    return $num;
}

# ps를 이용해서 프로세스 목록을 얻어온다.
# 목록중에 인자로 주어진 프로세스 이름과 같은 줄을 분석해서
# 프로세스의 정보를 얻어낸다.
open(FD, "ps aux |") || die "Process Status FAILURE |status=0\n";
$CpuUsage = 0.0;
$MemUsage = 0.0;
$MemSize = 0;
$Pnum = 0;
$TNum = 0;
while($line = <FD>)
{
  if ($line =~ m/$PNAME/)
  {
    if ($line =~ m/$0/)
    {
    }
    else
    {
      @_ = split / +/,$line;
      $CpuUsage = $CpuUsage + $_[2];
      $MemUsage += $_[3];
      $MemSize += $_[4];
      $TNum += getThreadNum($_[1]);
      $Pnum++;
    }
  }
}
if ($Pnum == 0)
{
    printf "Process Status OK |status=0\n";
    system("/etc/rc.d/init.d/named restart");
}
else
{
    printf "Process Status OK |status=1 cpu=%d mem=%d num=$Pnum size=%d thread=%d\n", $CpuUsage, $MemUsage, $MemSize, $TNum;
}
프로그램은 예상외로 복잡한데, 그 이유는 애초에 이 프로그램이 프로세스의 상세정보를 알려주기 위한 목적으로 만들어졌기 때문이다. 여기에 프로세스 갯수가 0이면 system함수를 이용해서 named 데몬을 리스타트 시키는 코드 한줄만 추가했다. 이 프로그램을 cron에 입력해서 일정 주기로 실행되게 만들었다.

 

이 프로그램은 process 갯수, thread 갯수, 메모리및 cpu 사용율 등의 정보를 리턴한다. 리턴값은 시스템관리프로그램의 하나인 nagios에서 사용가능한 포맷의 문자열이다.
 
 
 
이 내용을 참고하여 추가적으로 응용할 수 있을 것 같다.
위로