[C_prg] 프로세스 자동 관리 ( 죽은 프로세스 살리기 )

서버 관리 편의상 만들어둔 몇몇 프로세서들이 이유없이 죽길래…

안죽을때까지 디버깅하는것보다 그냥 다시 띄우는게 나을듯해서 (아~~ 게으름…)

뚝딱 만들어봤습니다.

[컴파일]

define 된 EXEC_NAME 과 LOG_FILE을 적당히 수정한 후

gcc -o snakeye snakeye.c 혹은 make snakeye

[실행]

./snakeye

그리고, 가끔 생각나면 로그확인.

이 녀석 또 몇번이나 죽었다 살아났구만…-_-;

그리고, 사용, 수정, 재배포는 마음대로~~~

/**********************************************************

스네이크아이…. ^^

snakeye.c v0.1

특정 프로세서의 활동을 체크…..

죽으면 다시 살린다… ^^  

2001.6.01 Khan ZieNie (zienie@hanmir.com)

**********************************************************/

#include <stdio.h>

#include <stdlib.h>  

#include <sys/time.h>

#include <sys/wait.h>

#define WAIT_TIME 60 /* 검사하는 간격 (초) */

#define EXEC_NAME “/home/zienie/some_program” /* 실행할 프로그램 */

#define LOG_FILE “/home/zienie/log/snakeye.log” /* 로그파일 */

int load_ps ();

int make_log ();

main ( void )

{

int c_pid, stat;

if ( fork () )

{  

printf ( “\\n=====================================================================” );

printf ( “\\n S T A R T snakeye v0.1 by ZieNie” );

printf ( “\\n=====================================================================” );

printf ( “\\n watching….[%s]\\n”, EXEC_NAME );

exit ( 1 );

}

c_pid = load_ps ( 0 );

while ( 1 )

{

if ( waitpid ( c_pid, &stat, WNOHANG ) != 0 )

c_pid = load_ps ( 1 );

sleep ( WAIT_TIME );

}

}

/***** 프로그램 로드 ********/

int load_ps ( int method )

{

int c_pid;

char str[256];

c_pid = fork ();

if ( c_pid == 0 )

{

execl ( EXEC_NAME, (char *)0 );

exit ( 1 );

}

if ( method == 0 ) /* 처음 구동시 로그. */

{

make_log ( “=====================================================================” );

make_log ( ” S T A R T snakeye v0.1 by ZieNie” );

make_log ( “=====================================================================” );

sprintf ( str, “Loading…[%s]: PID:%d”, EXEC_NAME, c_pid );

}

else /* 리로드시 로그 */

sprintf ( str, “Reloaing…[%s]: PID:%d”, EXEC_NAME, c_pid );

make_log ( str );

return c_pid;

}

/* 메세지를 받아서 로그파일을 만든다. */

int make_log ( char *msg )

{

time_t t;

struct tm *get;

FILE *fp;

fp = fopen ( LOG_FILE, “a” );

if ( fp == NULL )

return ( 0 ); /* 로그를 못만들면 그냥 리턴…. */

t = time ( 0 );

get = localtime ( &t );

fprintf ( fp, “[%02d/%02d %02d:%02d:%02d] %s\\n”,

get->tm_mon+1, get->tm_mday, get->tm_hour, get->tm_min, get->tm_sec, msg );

fclose ( fp );

}

서진우

슈퍼컴퓨팅 전문 기업 클루닉스/ 상무(기술이사)/ 정보시스템감리사/ 시스존 블로그 운영자

You may also like...

페이스북/트위트/구글 계정으로 댓글 가능합니다.