From 1eed11b4d47ef21bf99883c3d092a1beb3b4b962 Mon Sep 17 00:00:00 2001 From: aixiao Date: Thu, 6 Apr 2023 16:04:45 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96=E6=97=A5=E5=BF=97=E8=BE=93?= =?UTF-8?q?=E5=87=BA=E5=8C=BA=E5=88=86=E4=B8=BB=E6=9C=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Makefile | 4 +-- conf/config.ini | 2 +- reboot_temperature.c | 73 ++++++++++++++++++++++++++++++-------------- reboot_temperature.h | 3 +- 4 files changed, 55 insertions(+), 27 deletions(-) diff --git a/Makefile b/Makefile index 5408a8d..0a8b094 100644 --- a/Makefile +++ b/Makefile @@ -1,7 +1,7 @@ CROSS_COMPILE ?= CC := $(CROSS_COMPILE)gcc -CFLAGS += -g -Os -Wall -L../libini -I../libini -fno-builtin -LIB += -lini -static +CFLAGS += -Wall -Os -g -L../libini -I../libini -fno-builtin +LIB += -Wl,-rpath,/root/libini/ /root/libini/libini.so BIN = reboot_temperature all: reboot_temperature.o diff --git a/conf/config.ini b/conf/config.ini index 0549315..6b4214d 100644 --- a/conf/config.ini +++ b/conf/config.ini @@ -1,6 +1,6 @@ [global] thermal_zone = "/sys/class/thermal/thermal_zone0/temp"; -temperature = 90 +temperature = 85 log_file = "log_reboot.log"; second = 60 nice = -20 diff --git a/reboot_temperature.c b/reboot_temperature.c index 1af3678..d9fb25f 100644 --- a/reboot_temperature.c +++ b/reboot_temperature.c @@ -20,38 +20,54 @@ static int error_log(float l_t, int c_t, char *log_file, char *recv_mail, int _i struct tm *tmp_ptr = NULL; FILE *fp = NULL; FILE *fd = NULL; - char buffer[SIZE]; - char temperature[SIZE]; + char buffer[SIZE+1024+270]; + char temperature[SIZE+1024]; + char hostname[SIZE]; + + memset(buffer, 0, SIZE+1024+270); + memset(temperature, 0, SIZE+1024); + memset(hostname, 0, SIZE); - memset(buffer, 0, SIZE); - memset(temperature, 0, SIZE); time(&tmpcal_ptr); tmp_ptr = localtime(&tmpcal_ptr); + if (gethostname(hostname, SIZE) != 0) + { + perror("gethostname"); + } + fd = fopen(log_file, "a+"); if (fd == NULL) return -1; - + // 写入日志文件FD - fprintf(fd, "%d.%d.%d %d:%d:%d %s %.3f℃ %s %.3f℃\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, "Raspberry CPU temperature", l_t, "Restartable or shutdown temperature", (float)c_t); + fprintf(fd, "[%d.%d.%d %d:%d:%d] %s %s %.3f℃, %s %.3f℃\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, hostname, "CPU temperature", l_t, "Restartable or shutdown temperature", (float)c_t); - if (_is == 1) { - if (_alert == 1) { - // 关机活重启时 - sprintf(temperature, "%d.%d.%d %d:%d:%d %s %.3f℃ %s %.3f℃\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, "Raspberry CPU temperature", l_t, "Restartable or shutdown temperature", + if (_is == 1) + { + + if (_alert == 1) + { + // 关机重启时 + snprintf(temperature, SIZE+1024, "[%d.%d.%d %d:%d:%d] %s %s %.3f℃, %s %.3f℃\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, hostname, "CPU temperature", l_t, "Restartable or shutdown temperature", (float)c_t); - sprintf(buffer, "gomail -r %s -s \"Raspberrypi Temperature\" -t \"%s\"", recv_mail, temperature); + snprintf(buffer, SIZE+1024+270, "gomail -r %s -s \"Raspberrypi Temperature\" -t \"%s\"", recv_mail, temperature); fp = popen(buffer, "r"); pclose(fp); - fp = NULL; - } else { + } + else + { // 正常温度时 - if (tmp_ptr->tm_min >= 10 && tmp_ptr->tm_min < 12) { - sprintf(temperature, "%d.%d.%d %d:%d:%d %s:%.3f℃\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, "Raspberry CPU temperature", l_t); - sprintf(buffer, "gomail -r %s -s \"Raspberrypi Temperature\" -t \"%s\"", recv_mail, temperature); + if (tmp_ptr->tm_min >= 10 && tmp_ptr->tm_min < 12) + { + snprintf(temperature, SIZE+1024, "[%d.%d.%d %d:%d:%d] %s %s:%.3f℃\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, hostname, "CPU temperature", l_t); + snprintf(buffer, SIZE+1024+270, "gomail -r %s -s \"Raspberrypi Temperature\" -t \"%s\"", recv_mail, temperature); fp = popen(buffer, "r"); + while (fgets(buffer, SIZE, fp) != NULL) { + fprintf(stdout, "%s", buffer); + } + pclose(fp); - fp = NULL; } } @@ -91,41 +107,52 @@ int main(int argc, char *argv[], char **env) (void)get_executable_path(path, executable_filename, sizeof(path)); inifile = strcat(path, inifile); + + if (-1 == access(inifile, F_OK)) { // 如果配置不存在 + inifile="/etc/reboot_temperature.ini"; + } + memset(buffer, 0, SIZE); memset(log_file, 0, SIZE); memset(recv_mail, 0, SIZE); + if (daemon(1, 1) == -1) { perror("daemon"); exit(1); } - if (-1 == (nice(getinikeyint("global", "nice", inifile)))) // 进程优先级 + if (-1 == (nice(getinikeyint("global", "nice", inifile)))) // 进程优先级 perror("nice"); + while (1) { - getinikeystring("global", "thermal_zone", inifile, buffer); // 获取thermal_zone路径 - getinikeystring("global", "log_file", inifile, log_file); // 获取日志文件名 - getinikeystring("global", "recv_mail", inifile, recv_mail); // 获取接收者邮箱 + getinikeystring("global", "thermal_zone", inifile, buffer); // 获取thermal_zone路径 + getinikeystring("global", "log_file", inifile, log_file); // 获取日志文件名 + getinikeystring("global", "recv_mail", inifile, recv_mail); // 获取接收者邮箱 if (get_temperature(buffer) >= getinikeyint("global", "temperature", inifile)) // 达到重启或者关机温度 { sync(); - if (getinikeyint("global", "off_power", inifile) == 1) { + if (getinikeyint("global", "off_power", inifile) == 1) + { error_log(get_temperature(buffer), getinikeyint("global", "temperature", inifile), log_file, recv_mail, getinikeyint("global", "is_alert", inifile), 1); return reboot(RB_POWER_OFF); // 关机 } else { error_log(get_temperature(buffer), getinikeyint("global", "temperature", inifile), log_file, recv_mail, getinikeyint("global", "is_alert", inifile), 1); return reboot(RB_AUTOBOOT); // 重启 } - } else // 未达到重启或者关机温度 + } + else // 未达到重启或者关机温度 { error_log(get_temperature(buffer), getinikeyint("global", "temperature", inifile), log_file, recv_mail, getinikeyint("global", "is_alert", inifile), 0); } + // 等待 sleep(getinikeyint("global", "second", inifile)); } + return 0; } diff --git a/reboot_temperature.h b/reboot_temperature.h index 5a5fefa..1200ffc 100644 --- a/reboot_temperature.h +++ b/reboot_temperature.h @@ -10,6 +10,7 @@ #include #include "libini.h" -#define SIZE 2700 + +#define SIZE 1024 #endif