// 프로세스 종료되면 자동으로 다시 띄워 주는 프로그램
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <sys/time.h>
#include <sys/types.h>
#include <unistd.h>
#include <sys/wait.h>
#define WAIT_TIME 10 /* 검사하는 간격 (초) */
#define EXEC_NAME "/user1/prs/src/prs 1> /user1/prs/src/log" /* 실행할 프로그램 */
#define WATCH_NAME "/user1/prs/src/prs" /* 실행할 프로그램 */
#define LOG_FILE "/user1/prs/src/prs_log" /* 로그파일 */
int load_ps ();
int make_log ();
int main ( void )
{
int c_pid, stat;
if ( fork () )
{
printf ( "\\n=====================================================================" );
printf ( "\\n S T A R T PRS " );
printf ( "\\n=====================================================================" );
printf ( "\\n watching....[%s]\\n", WATCH_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 );
execl ( WATCH_NAME, (char *)0 );
exit ( 1 );
}
if ( method == 0 ) /* 처음 구동시 로그. */
{
make_log ( "=====================================================================" );
make_log ( " S T A R T PRS" );
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 );
// time (&t);
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 );
return(0);
}
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <sys/time.h>
#include <sys/types.h>
#include <unistd.h>
#include <sys/wait.h>
#define WAIT_TIME 10 /* 검사하는 간격 (초) */
#define EXEC_NAME "/user1/prs/src/prs 1> /user1/prs/src/log" /* 실행할 프로그램 */
#define WATCH_NAME "/user1/prs/src/prs" /* 실행할 프로그램 */
#define LOG_FILE "/user1/prs/src/prs_log" /* 로그파일 */
int load_ps ();
int make_log ();
int main ( void )
{
int c_pid, stat;
if ( fork () )
{
printf ( "\\n=====================================================================" );
printf ( "\\n S T A R T PRS " );
printf ( "\\n=====================================================================" );
printf ( "\\n watching....[%s]\\n", WATCH_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 );
execl ( WATCH_NAME, (char *)0 );
exit ( 1 );
}
if ( method == 0 ) /* 처음 구동시 로그. */
{
make_log ( "=====================================================================" );
make_log ( " S T A R T PRS" );
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 );
// time (&t);
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 );
return(0);
}