죽은 프로세스 살리기
#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);
}
#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);
}