[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 );
}