자동으로 특정 프로세스 되살리기
글   쓴   이 linux
날         짜 2003년 01월 17일 23시 35분 49초
본         문 서버 관리 편의상 만들어둔 몇몇 프로세스들이 이유없이 죽길래...
안죽을때까지 디버깅하는것보다 그냥 다시 띄우는게 나을듯해서 (아~~ 게으름...)
뚝딱 만들어봤습니다.


[컴파일]
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
#include
#include
#include

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


관련 게시물 : 1 (Total 1 Articles)
번 호 제 목 글쓴이 작성일 조회수 선 택
1  자동으로 특정 프로세스 되살리기 linux03-01-171743