117 lines
2.8 KiB
C
117 lines
2.8 KiB
C
#include "main.h"
|
|
#include "libconf.h"
|
|
|
|
int get_process_pid(char *proces_name)
|
|
{
|
|
char bufer[PATH_SIZE];
|
|
char comm[PATH_SIZE];
|
|
char proc_comm_name[PATH_SIZE];
|
|
int num[PATH_SIZE] = { 0 };
|
|
int n = 0;
|
|
FILE *fp;
|
|
DIR *dir;
|
|
struct dirent *ptr;
|
|
dir = opendir("/proc");
|
|
while ((ptr = readdir(dir)) != NULL) {
|
|
if (ptr->d_type == 4 && strcasecmp(ptr->d_name, ".") && strcasecmp(ptr->d_name, "..")) {
|
|
bzero(bufer, 0);
|
|
sprintf(comm, "/proc/%s/comm", ptr->d_name);
|
|
if (access(comm, F_OK) == 0) {
|
|
fp = fopen(comm, "r");
|
|
if (fgets(bufer, PATH_SIZE - 1, fp) == NULL) {
|
|
fclose(fp);
|
|
continue;
|
|
}
|
|
sscanf(bufer, "%s", proc_comm_name);
|
|
if (!strcmp(proces_name, proc_comm_name)) {
|
|
num[n] = atoi(ptr->d_name);
|
|
n += 1;
|
|
}
|
|
fclose(fp);
|
|
}
|
|
}
|
|
|
|
}
|
|
|
|
n -= 1; // 去除最后一个搜索时的本身进程
|
|
closedir(dir);
|
|
if (num[0] > 0)
|
|
return num[0];
|
|
else
|
|
return 0;
|
|
}
|
|
|
|
char *times()
|
|
{
|
|
time_t t;
|
|
struct tm *timeinfo;
|
|
time(&t);
|
|
timeinfo = localtime(&t);
|
|
return asctime(timeinfo);
|
|
}
|
|
|
|
int logs(char *str, char *configfile)
|
|
{
|
|
FILE *fp = NULL;
|
|
fp = fopen(read_conf(configfile, "global", "LOGFILE"), "a+");
|
|
fprintf(fp, str);
|
|
return fclose(fp);
|
|
}
|
|
|
|
int loop(char *configfile)
|
|
{
|
|
FILE *fp;
|
|
char buffer[PATH_SIZE];
|
|
while (1) {
|
|
if (get_process_pid(read_conf(configfile, "global", "PROCESS_NAME")) <= 0) {
|
|
logs(times(), configfile);
|
|
logs("没有运行\n", configfile);
|
|
fp = _popen(read_conf(configfile, "global", "COMMAND"), "r");
|
|
|
|
logs(times(), configfile);
|
|
logs("执行结果\n", configfile);
|
|
while (fgets(buffer, sizeof(buffer), fp)) {
|
|
//printf("%s", buffer);
|
|
logs(buffer, configfile);
|
|
}
|
|
_pclose(fp);
|
|
} else {
|
|
logs(times(), configfile);
|
|
logs("运行\n", configfile);
|
|
}
|
|
sleep(atoi(read_conf(configfile, "global", "TIME")));
|
|
}
|
|
}
|
|
|
|
int main(int argc, char **argv, char **env)
|
|
{
|
|
char configfile[PATH_SIZE];
|
|
int opt;
|
|
|
|
memset(configfile, 0, PATH_SIZE);
|
|
while ((opt = getopt(argc, argv, "c:")) != -1) {
|
|
switch (opt) {
|
|
case 'c':
|
|
strcpy(configfile, optarg);
|
|
break;
|
|
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
|
|
if (strlen(configfile) == 0) {
|
|
strcpy(configfile, "daemon.conf");
|
|
}
|
|
printf("%s\n", configfile);
|
|
|
|
if (daemon(1, 1)) {
|
|
perror("daemon");
|
|
return 1;
|
|
}
|
|
|
|
loop(configfile);
|
|
|
|
return 0;
|
|
}
|