죽은 프로세스 살리기

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

서진우

슈퍼컴퓨팅 전문 기업 클루닉스/ 상무(기술이사)/ 정보시스템감리사/ 시스존 블로그 운영자

You may also like...

페이스북/트위트/구글 계정으로 댓글 가능합니다.