2003. 2. 12. 11:49

프로세스 다시 띄우기

// 프로세스 종료되면 자동으로 다시 띄워 주는 프로그램
#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);
}