diff --git a/Makefile b/Makefile index fa607ae..c9e6858 100644 --- a/Makefile +++ b/Makefile @@ -1,7 +1,7 @@ CROSS_COMPILE ?= CC := $(CROSS_COMPILE)gcc -CFLAGS += -g -Wall -L../libini -I../libini -fno-builtin -LIB += -lini -static -g +CFLAGS += -g -O2 -Wall -L../libini -I../libini -fno-builtin +LIB += -lini -static BIN = reboot_temperature all: reboot_temperature.o diff --git a/conf/config.ini b/conf/config.ini index 5907076..ccffeb3 100644 --- a/conf/config.ini +++ b/conf/config.ini @@ -1,7 +1,8 @@ [server] thermal_zone = "/sys/class/thermal/thermal_zone0/temp"; -temperature = 80 -log_file = "reboot.log"; -second = 10 -off_power = 0 +temperature = 70 +log_file = "log_reboot.log"; +second = 60 +nice = -20 +off_power = 1 diff --git a/reboot_temperature b/reboot_temperature deleted file mode 100644 index 6d63f9b..0000000 Binary files a/reboot_temperature and /dev/null differ diff --git a/reboot_temperature.c b/reboot_temperature.c index f9df0e2..563c62d 100644 --- a/reboot_temperature.c +++ b/reboot_temperature.c @@ -3,108 +3,126 @@ int get_temperature(char *path) { char buffer[SIZE]; - FILE *fp; - if ((fp = fopen(path, "r")) < 0) { - return 1; /* 文件不存在,则退出. */ - } - while (fgets(buffer, SIZE, fp) != NULL) { - ; - } + if ((fp = fopen(path, "r")) < 0) + return -1; /* 文件不存在,则退出. */ + + while (fgets(buffer, SIZE, fp) != NULL) ; fclose(fp); return atoi(buffer) / 1000; } -int log(int l_t, int c_t, char *log_file) +int error_log(int l_t, int c_t, char *log_file) +{ + time_t tmpcal_ptr; + struct tm *tmp_ptr = NULL; + FILE *fp; + char buffer[SIZE]; + char temperature[SIZE]; + + memset(buffer, 0, SIZE); + memset(temperature, 0, SIZE); + time(&tmpcal_ptr); + tmp_ptr = localtime(&tmpcal_ptr); + + FILE *fd = fopen(log_file, "a+"); + if (fd == NULL) + return -1; + + // 写入日志文件FD + fprintf(fd, "%d.%d.%d %d:%d:%d %s %d %s %d\n", (1900 + tmp_ptr->tm_year), (1 + tmp_ptr->tm_mon), tmp_ptr->tm_mday, tmp_ptr->tm_hour, tmp_ptr->tm_min, tmp_ptr->tm_sec, "树莓CPU温度", l_t, "达到可重启温度", c_t); + + // 发送邮件字符串 + sprintf(temperature, "%d.%d.%d %d:%d:%d %s %d %s %d\n", (1900 + tmp_ptr->tm_year), (1 + tmp_ptr->tm_mon), tmp_ptr->tm_mday, tmp_ptr->tm_hour, tmp_ptr->tm_min, tmp_ptr->tm_sec, "树莓CPU温度", l_t, "达到可重启温度", c_t); + + sprintf(buffer, "/root/qqMail/qqMail -l smtp.qq.com -p 25 -f 1605227279 -e dqqpbbbxoazibafd -q NIUYULING -r 1605227279@QQ.COM -n NIUYULING -s \"Raspberrypi Temperature\" -t \"%s\"", temperature); + //printf("%s\n", buffer); + + fp = popen(buffer, "r"); + pclose(fp); + fclose(fd); + + return 0; +} + +int correct_log(int l_t, int c_t, char *log_file) { time_t tmpcal_ptr; struct tm *tmp_ptr = NULL; time(&tmpcal_ptr); tmp_ptr = localtime(&tmpcal_ptr); - FILE *fd = fopen(log_file, "a+"); - if (fd == NULL) { - return 0; - } - fprintf(fd, "%d.%d.%d %d:%d:%d %s %d %s %d\n", (1900 + tmp_ptr->tm_year), - (1 + tmp_ptr->tm_mon), tmp_ptr->tm_mday, tmp_ptr->tm_hour, - tmp_ptr->tm_min, tmp_ptr->tm_sec, - "树莓CPU温度", l_t, "达到可重启温度", c_t); + if (fd == NULL) + return -1; + + fprintf(fd, "%d.%d.%d %d:%d:%d %s %d %s %d\n", (1900 + tmp_ptr->tm_year), (1 + tmp_ptr->tm_mon), tmp_ptr->tm_mday, tmp_ptr->tm_hour, tmp_ptr->tm_min, tmp_ptr->tm_sec, "树莓派CPU温度", l_t, "未达到重启或者关机温度", c_t); fclose(fd); - char temperature[270]; - sprintf(temperature, "%d.%d.%d %d:%d:%d %s %d %s %d\n", (1900 + tmp_ptr->tm_year), (1 + tmp_ptr->tm_mon), tmp_ptr->tm_mday, tmp_ptr->tm_hour, tmp_ptr->tm_min, tmp_ptr->tm_sec, - "树莓CPU温度", l_t, "达到可重启温度", c_t); - - // 发送告警邮件 - //char *argv[]={"/root/qqMail/qqMail", "-l", "smtp.qq.com", "-p", "25", "-f", "1605227279", "-e", "dqqpbbbxoazibafd", "-q", "NIUYULING", "-r", "1605227279@QQ.COM", "-n", "NIUYULING", "-s", "Raspberrypi Temperature", "-t", temperature, (char*)0}; - //execv("/root/qqMail/qqMail", argv); - - char buffer[2700]; - sprintf(buffer, "/root/qqMail/qqMail -l smtp.qq.com -p 25 -f 1605227279 -e dqqpbbbxoazibafd -q NIUYULING -r 1605227279@QQ.COM -n NIUYULING -s \"Raspberrypi Temperature\" -t \"%s\"", temperature); - //printf("%s\n", buffer); - FILE *fp; - fp = popen(buffer, "r"); - pclose(fp); - return 0; } int get_executable_path(char *processdir, char *processname, int len) { char *filename; - if (readlink("/proc/self/exe", processdir, len) <= 0) { + + if (readlink("/proc/self/exe", processdir, len) <= 0) return -1; - } filename = strrchr(processdir, '/'); if (filename == NULL) return -1; ++filename; strcpy(processname, filename); *filename = '\0'; + return (int)(filename - processdir); } -int main(int argc, char *argv[]) +int main(int argc, char *argv[], char **env) { char buffer[SIZE]; char log_file[SIZE]; - memset(buffer, 0, SIZE); - memset(log_file, 0, SIZE); - char *inifile = "conf/config.ini"; char path[SIZE] = { 0 }; char executable_filename[SIZE] = { 0 }; (void)get_executable_path(path, executable_filename, sizeof(path)); - inifile=strcat(path, inifile); + inifile = strcat(path, inifile); + + memset(buffer, 0, SIZE); + memset(log_file, 0, SIZE); if (daemon(1, 1) == -1) { perror("daemon"); exit(1); } + if (-1 == (nice(getinikeyint("server", "nice", inifile)))) { // 进程优先级 + perror("nice"); + } + while (1) { getinikeystring("server", "thermal_zone", inifile, buffer); // 获取thermal_zone路径 - getinikeystring("server", "log_file", inifile, log_file); // 获取日志文件名 - - if (get_temperature(buffer) >= getinikeyint("server", "temperature", inifile)) { - + getinikeystring("server", "log_file", inifile, log_file); // 获取日志文件名 + + if (get_temperature(buffer) >= getinikeyint("server", "temperature", inifile)) { // 达到重启或者关机温度 sync(); if (getinikeyint("server", "off_power", inifile) == 1) { - log(get_temperature(buffer), getinikeyint("server", "temperature", inifile), log_file); + error_log(get_temperature(buffer), getinikeyint("server", "temperature", inifile), log_file); + return reboot(RB_POWER_OFF); // 关机 - return reboot(RB_POWER_OFF); // 关机 } else { - log(get_temperature(buffer), getinikeyint("server", "temperature", inifile), log_file); + error_log(get_temperature(buffer), getinikeyint("server", "temperature", inifile), log_file); + return reboot(RB_AUTOBOOT); // 重启 - return reboot(RB_AUTOBOOT); // 重启 } + } else { // 未达到重启或者关机温度 + correct_log(get_temperature(buffer), getinikeyint("server", "temperature", inifile), log_file); } + sleep(getinikeyint("server", "second", inifile)); } - return 1; + return 0; } diff --git a/reboot_temperature.h b/reboot_temperature.h index 7c8f916..5a5fefa 100644 --- a/reboot_temperature.h +++ b/reboot_temperature.h @@ -1,3 +1,6 @@ +#ifndef REBOOT_TEMPERATUR_H +#define REBOOT_TEMPERATUR_H + #include #include #include @@ -7,4 +10,6 @@ #include #include "libini.h" -#define SIZE 270 +#define SIZE 2700 + +#endif diff --git a/reboot_temperature.o b/reboot_temperature.o deleted file mode 100644 index da0f0d4..0000000 Binary files a/reboot_temperature.o and /dev/null differ