Create temp_cpu.sh
Файл контроля температуры CPU
This commit is contained in:
76
temp_cpu.sh
Normal file
76
temp_cpu.sh
Normal file
@@ -0,0 +1,76 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
# Конфигурация
|
||||||
|
LOG_FILE="/var/log/cpu_temp_monitor.log"
|
||||||
|
LOCK_FILE="/var/run/cpu_temp_monitor.pid"
|
||||||
|
HIGH_TEMP=50 # Порог включения усиленного охлаждения
|
||||||
|
LOW_TEMP=40 # Порог отключения усиленного охлаждения
|
||||||
|
CHECK_INTERVAL=5 # Интервал проверки (секунд)
|
||||||
|
COOLING_MODE=false # Текущий режим кулеров
|
||||||
|
|
||||||
|
# Защита от дублирования
|
||||||
|
if [ -f "$LOCK_FILE" ]; then
|
||||||
|
if ps -p $(cat "$LOCK_FILE") >/dev/null 2>&1; then
|
||||||
|
echo "Ошибка: Скрипт уже запущен (PID: $(cat "$LOCK_FILE"))" | tee -a "$LOG_FILE"
|
||||||
|
exit 1
|
||||||
|
else
|
||||||
|
rm -f "$LOCK_FILE"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
echo $$ > "$LOCK_FILE"
|
||||||
|
trap "rm -f '$LOCK_FILE'; exit" SIGINT SIGTERM
|
||||||
|
|
||||||
|
# Функция управления кулерами
|
||||||
|
cooling_control() {
|
||||||
|
local mode=$1
|
||||||
|
case $mode in
|
||||||
|
"high")
|
||||||
|
ipmitool raw 0x2e 0x30 00 00 100 >> "$LOG_FILE" 2>&1
|
||||||
|
COOLING_MODE=true
|
||||||
|
echo "[$(date '+%Y-%m-%d %H:%M:%S')] Включен турбо-режим кулеров (Max temp: $2°C)" >> "$LOG_FILE"
|
||||||
|
;;
|
||||||
|
"low")
|
||||||
|
ipmitool raw 0x2e 0x30 00 00 30 >> "$LOG_FILE" 2>&1
|
||||||
|
COOLING_MODE=false
|
||||||
|
echo "[$(date '+%Y-%m-%d %H:%M:%S')] Включен нормальный режим кулеров (Max temp: $2°C)" >> "$LOG_FILE"
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
}
|
||||||
|
|
||||||
|
# Функция получения температуры с обработкой ошибок
|
||||||
|
get_cpu_temp() {
|
||||||
|
local sensor=$1
|
||||||
|
local temp=$(ipmitool sensor reading "$sensor" 2>/dev/null | awk '{print $NF}' | tr -dc '0-9')
|
||||||
|
[[ -z "$temp" || ! "$temp" =~ ^[0-9]+$ ]] && { echo "ERROR"; return 1; }
|
||||||
|
echo "$temp"
|
||||||
|
}
|
||||||
|
|
||||||
|
# Основной цикл мониторинга
|
||||||
|
while true; do
|
||||||
|
timestamp=$(date "+%Y-%m-%d %H:%M:%S")
|
||||||
|
|
||||||
|
# Получаем температуры обоих процессоров
|
||||||
|
temp1=$(get_cpu_temp "CPU1 Temp")
|
||||||
|
temp2=$(get_cpu_temp "CPU2 Temp")
|
||||||
|
|
||||||
|
# Определяем максимальную температуру
|
||||||
|
max_temp=$(( temp1 > temp2 ? temp1 : temp2 ))
|
||||||
|
|
||||||
|
# Логирование
|
||||||
|
echo "[$timestamp] CPU1: ${temp1}°C, CPU2: ${temp2}°C, Max: ${max_temp}°C" >> "$LOG_FILE"
|
||||||
|
|
||||||
|
# Управление кулерами с гистерезисом по максимальной температуре
|
||||||
|
if $COOLING_MODE; then
|
||||||
|
# Если кулеры в турбо-режиме, проверяем снижение до LOW_TEMP
|
||||||
|
if [ "$max_temp" -le "$LOW_TEMP" ]; then
|
||||||
|
cooling_control "low" "$max_temp"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
# Если кулеры в нормальном режиме, проверяем превышение HIGH_TEMP
|
||||||
|
if [ "$max_temp" -ge "$HIGH_TEMP" ]; then
|
||||||
|
cooling_control "high" "$max_temp"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
sleep $CHECK_INTERVAL
|
||||||
|
done
|
||||||
Reference in New Issue
Block a user