본문 바로가기

개발/서버

죽은 프로세스 살리기

#include <stdio.h>

#include <string.h>

#include <dirent.h>

#include <unistd.h>

#include <sys/types.h>

#include <time.h>

#include <stdlib.h>

    

/* 검사 주기(초) */

#define CHECK_SECOND        30  


/* 실행 서버 패스 및 이름 */

#define APP_PATH            "/root/ztsvr/ztsvr"

#define APP_NAME            "ztsvr"


int check_process();

void get_timef(time_t, char *);


int main()

{

    int rt;

    time_t  the_time;

    char buffer[255];

    char app[255];


    sprintf(app, "nohup %s &", APP_PATH);


    printf("START\n");

    fflush(stdout);

    while(1)

    {

        time(&the_time);

        get_timef(the_time, buffer);


        rt = check_process();


        if(rt == 0)

        {

            printf("DIE: %s\n", buffer);


            /** 새로 뛰움 **/

            system(app);

            printf("RELOAD: %s\n", buffer);

        }

        else

        {

            printf("OK: %s\n", buffer);

        }


        fflush(stdout);

        

       /* 검사 후, process sleep */

        sleep(CHECK_SECOND);    

    }

    return 0;

}


/** 프로세스 검사 */

int check_process()

{   

    DIR* pdir;

    struct dirent *pinfo;

    int is_live = 0;


    pdir = opendir("/proc");

    if(pdir == NULL)

    {

        printf("err: NO_DIR\n");

        return 0;

    }


    /** /proc 디렉토리의 프로세스 검색 */

    while(1)

    {

        pinfo = readdir(pdir);

        if(pinfo == NULL)

            break;


        /** 파일이거나 ".", "..", 프로세스 디렉토리는 숫자로 시작하기 때문에 아스키코드 57(9)가 넘을 경우 건너뜀 */

        if(pinfo->d_type != 4 || pinfo->d_name[0] == '.' || pinfo->d_name[0] > 57)

            continue;


        FILE* fp;

        char buff[128];

        char path[128];


        sprintf(path, "/proc/%s/status", pinfo->d_name);

        fp = fopen(path, "rt");

        if(fp)

        {

            fgets(buff, 128, fp);

            fclose(fp);


            /** 프로세스명과 status 파일 내용과 비교 */  

            if(strstr(buff, APP_NAME))

            {

                is_live = 1;

                break;

            }

        }

        else

        {

            printf("Can't read file [%s]\n", path);

        }

    }


    closedir(pdir);


    return is_live;

}


/** 현재 시간을 설정 */

void get_timef(time_t org_time, char *time_str)

{

    struct tm *tm_ptr;

    tm_ptr = localtime(&org_time);


    sprintf(time_str, "%d/%d/%d %d:%d:%d",

                    tm_ptr->tm_year+1900,

                    tm_ptr->tm_mon+1,

                    tm_ptr->tm_mday,

                    tm_ptr->tm_hour,

                    tm_ptr->tm_min,

                    tm_ptr->tm_sec);

}

'개발 > 서버' 카테고리의 다른 글

ddos 방화벽 룰  (0) 2015.09.10
UNIX IP Stack Tuning Guide v2.7  (0) 2015.09.10
How to kill zombie process [closed]  (0) 2015.09.10
DNS 시스템에 대한 위협에 대해  (0) 2015.02.03
apache 디폴트 설정  (2) 2014.12.09