80 lines
3.0 KiB
Bash
80 lines
3.0 KiB
Bash
#!/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 # Текущий режим кулеров
|
||
|
||
# При включении сервера выставить работу кулеров в 30%
|
||
ipmitool raw 0x2e 0x30 00 00 30
|
||
|
||
# Защита от дублирования
|
||
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
|