활성 코어 온도를 모니터링하기 위해 Linux에서 스크립트를 작성 중입니다.
그런 다음 CORE 0 TEMP가 40도에 도달하면 ACPI 팬을 수동으로 활성화합니다.
작업을 단순하게 유지하기 위해 bash 터미널에 명령을 입력하여 fanon이라는 요청 시 작동하는 팬 스크립트를 만들었습니다.
하지만 이 CORE 0 임시 출력을 간격(예: 2초마다)으로 업데이트되는 gettemp라는 bash 스크립트의 변수로 CAT하는 방법을 알고 싶습니다.
시계 센서를 사용하면 터미널에 다음과 같은 출력이 표시됩니다.
acpitz-virtual-0
Adapter: Virtual device
temp1: +45.0°C (crit = +256.0°C)
temp2: +36.0°C (crit = +105.0°C)
temp3: +32.0°C (crit = +105.0°C)
temp4: +24.1°C (crit = +105.0°C)
temp5: +100.0°C (crit = +110.0°C)
coretemp-isa-0000
Adapter: ISA adapter
Core 0: +41.0°C (crit = +100.0°C) <--- This is the temp I need!
Core 1: +38.0°C (crit = +100.0°C)
다음을 수행하려면 어떻게든 Core 0 Temp를 찾아야 합니다.
Core0Temp=$(cat /PATH/TO/ISA/TEMP/GOES/HERE)
Core1Temp=$(cat /PATH/TO/ISA/TEMP2/GOES/HERE)
그럼 난 할 수 있어
if [ $Core0Temp -gt "40" ]; then
echo "Exceeding Temp Value. Enabling Fan."
/var/tempmon/fanon
elif [ $Core0Temp -lt "40" ]; then
echo "Turning Fan Off."
/var/tempmon/fanoff
fi
나만의 냉각 메커니즘을 만들어야 하는 이유를 궁금해하는 사람이 있다면 이는 단순히 Compaq NX-6310 비즈니스 노트북을 사용하고 있기 때문입니다.
이 제품(제조업체)은 ACPI 열 이벤트를 제대로 처리하지 못하고 ACPI 팬과의 연결 상태가 매우 좋지 않습니다. Google의 많은 검색에서는 냉각 시스템을 수동으로 활성화하는 방법만 보여주었습니다. 다음과 같습니다.
echo "Enabling ACPI FAN... "
echo 1 > /sys/class/thermal/cooling_device2/cur_state
echo "Fan Enabled... "
팬을 비활성화하려면 sudo를 통해 다음 명령을 실행합니다.
echo "Disabling ACPI FAN..."
echo 0 > /sys/class/thermal/cooling_device2/cur_state
echo "Fan Disabled..."
따라서 표준 노트북에서 기대하는 것처럼 열 칩이 온도를 보고하고 이에 따라 팬을 활성화할 수 있도록 이 스크립트를 작성해야 합니다. 실제 중심 온도가 어디에 있는지 찾을 수 없습니다. 시계 센서에서는 찾을 수 있지만 저는 찾을 수 없습니다.
답변1
예, ACPI 온도는 이보다 낮지 /sys/class/thermal
만 lm_sensors
하드웨어 모니터링 센서는 이보다 낮습니다 /sys/class/hwmon/
.
내 시스템에는 , 및 아래 /sys/class/hwmon/
에 세 개의 하위 디렉터리가 있습니다 . 내 경우 이 모듈은 다음과 같습니다 . 시스템에 따라 다를 수 있습니다. 간단히 실행하여 각 하위 디렉터리를 식별할 수 있습니다 . 여기서 N은 숫자입니다.hwmon0
hwmon1
hwmon2
coretemp
hwmon1
cat /sys/class/hwmon/hwmonN/name
coretemp
내 시스템의 온도 값은 각각 /sys/class/hwmon/hwmon1/temp2_input
및 입니다 /sys/class/hwmon/hwmon1/temp3_input
. 특정 CPU 모델에 따라 이러한 파일 이름의 숫자가 tempN_input
실제 숫자와 다를 수도 있습니다. 이 값은 섭씨 천분의 1도입니다. 즉, 41000은 섭씨 41.0도입니다.
답변2
sysfs가 설치되어 있는 경우(기본적으로 설치되어 있어야 함) 에서 임시 판독값을 찾을 수 있습니다 /sys/class/thermal/thermal_zoneX/temp
.
내 컴퓨터에서는 다음 방법이 성공했습니다.
$ cat /sys/class/thermal/thermal_zone0/temp
27800
$ cat /sys/class/thermal/thermal_zone1/temp
29800
$ sensors
acpitz-virtual-0
Adapter: Virtual device
temp1: +27.8°C (crit = +105.0°C)
temp2: +29.8°C (crit = +105.0°C)
답변3
11시간이 지났는데..아직 살아있어요!
——ACPI Thermal CPU 위첨자의 탄생.
이름을 지어줬어요, 템몬!
나는 그것을 모두 이해합니다.
- 임시값을 구하는 방법을 알아냈습니다...
- 내가 찾은 내용을 위 첨자로 바꾸었습니다…
이 스크립트를 작성하는 데는 엄청난 코딩 세션이 소요되었습니다...
몇 시간 동안 디버깅하고 테스트했지만 꿈처럼 작동했습니다.
아직 완전히 완성된 것은 아니며 여기저기서 약간의 수정이 이루어졌지만 작동하고 지속적입니다!
- 온도를 확인하고,
- 코어 0 온도 판독값을 기반으로 ACPI 팬을 켜고 끕니다.
다시 저온으로 돌아가면..
- 동일한 프로세스 내에서 자동으로 다시 실행됩니다!
- tput 및 setaf인 $($tput $setaf $xwhite)의 경우 색상으로 구분되어 있지만 해당 태그를 제거하고 기본으로 유지할 수 있습니다.
SUDO/ROOT로 실행해야 합니다.
전체 완성된 스크립트를 아래에 넣겠습니다. 여기에는 명령이 너무 많기 때문에 몇 시간 전에 제가 질문한 내용을 완전하게 완성하지 않고서는 만족시킬 수 없으며, 완전히 답변하고 스스로 해결하지 못할 것입니다. 문제는 완전한 코드가 없다는 것입니다!
또한 이 수정 사항은 실제로 HP 커뮤니티의 Compaq NX-6310 비즈니스 노트북에 대한 심각한 버그 수정 사항입니다! 및 기타 - 어쩌면 이러한 유형의 노트북을 사용하는 다른 사용자가 이 기능이 유용하다고 생각할 수도 있고, 다른 사용자도 비슷한 ACPI 열 문제를 겪고 있을 수도 있습니다. Linux Debian 9에서는 ACPI가 ACPI 팬 자체를 트리거하지 않습니다... 그런 다음 붐, 과열 = 노트북이 정지됩니다.
# HP COMPAQ NX6310 - Reported Issue over@http://forum.notebookreview.com/threads/acpi-issues-overheating-badly-due-to-fan-not-coming-on-hp-nx6325.113746/
#!/bin/bash
# TEMPMON - THE CPU/ACPI THERMAL MONITORING MECHANISM
#FOR THE COMPAQ NX6310 ACPI-CPU-THERMAL FAN ISSUE
#######################
# STACK EXCHANGE QUESTION: BY SHAUN SHORTY CASSIDY.
# https://unix.stackexchange.com/questions/418919/how-to-obtain-cat-cpu-core-temp-from-isa-adapter-debian/418935#418935
# How to obtain/cat CPU Core Temp from ISA Adapter? - Debian
# STATUS: SOLVED BY THIS SCRIPT.
######################
# Clear the Terminal
#-------------------------------------------------------------------------------------------------
clear
# Enter into script directory
cd /var/tempmon/
# Include Terminal Color Sheet.
. ./style/colors
## Using Sed from:
## https://stackoverflow.com/questions/16623835/remove-a-fixed-prefix-
suffix-from-a-string-in-bash
## CREATE PREFIX AND SUFFIX FOR STRING MANIPULATION.
tempSuffix=".0°C"
tempPrefix="+"
## SET UP GUI INTERFACE
echo "$($tput $setaf $xwhite)----------------------------------------------------"
echo "$($tput $setaf $xcyan) tempmon | The CPU/ACPI Thermal Monitoring Script!"
echo "$($tput $setaf $xred)----------------------------------------------------"
## GET THE CORE TEMPS AT SCRIPT STARTUP.
echo "$($tput $setaf $xwhite)Getting Core 0 temp from Sensors."
echo "$($tput $setaf $xwhite)Getting Core 1 temp from Sensors."
echo "$($tput $setaf $xmagenta)Getting ACPI Fan Status from Sensors."
sleep 0.1
#-------------------------------------------------------------------------------------------------
## READ THE SENSORS
Core0Temp=$(sensors | grep -i "Core 0:" | awk '{print $3}')
Core1Temp=$(sensors | grep -i "Core 1:" | awk '{print $3}')
## SETUP THE ACPI FAN SENSOR
# FAN SENSOR FILE
Fan0_File="/sys/class/thermal/cooling_device2/cur_state"
# FAN SENSOR STATUS
Fan0_Status=$(cat $Fan0_File)
# FAN MODULE ON
Fan0_On="1"
# FAN MODULE OFF
Fan0_Off="0"
#-------------------------------------------------------------------------------------------------
echo "$($tput $setaf $xred)----------------------------------------------------"
echo "$($tput $setaf $xcyan)Configuring Core 0 temp into Readable Format."
echo "$($tput $setaf $xwhite)Configuring Core 1 temp into Readable Format."
## CONFIGURE THE TEMPS FOR THE SCRIPTS USE.
sleep 0.1
Core0Temp1=$(echo "$Core0Temp" | sed -e "s/^$tempPrefix//" -e "s/$tempSuffix$//")
Core1Temp1=$(echo "$Core1Temp" | sed -e "s/^$tempPrefix//" -e "s/$tempSuffix$//")
echo "$($tput $setaf $xred)----------------------------------------------------"
echo "$($tput $setaf $xcyan)Starting CPU Monitor: Core Temp 0: "$Core0Temp1""$tempSuffix
echo "$($tput $setaf $xwhite)Starting CPU Monitor: Core Temp 1: "$Core1Temp1""$tempSuffix
## SET THE TEMP MARKER - STARTING TEMP
## SET THE TEMP START - THRESHOLD TEMP
#-------------------------------------------------------------------------------------------------
tempMarker="35"
tempIDLE=$(echo $tempMarker)
tempStart="35"
sleep 0.1
echo "$($tput $setaf $xred)----------------------------------------------------"
echo "$($tput $setaf $xwhite)Setting Initial Temp Marker @ "$tempMarker$tempSuffix
echo "$($tput $setaf $xwhite)Setting Initial Temp Threshold @ "$tempStart$tempSuffix
sleep 0.1
echo "$($tput $setaf $xred)----------------------------------------------------"
## IF CPU CORE 0 TEMP IS GREATER THAN IDLE TEMP OF 35;THEN RUN LOOP..
## (HAS TO BE LOW TO TRIGGER THE LOOP)
#------------------------------------------------------------------------------------------------- #
while true; do
if [ $Core0Temp1 -gt $tempMarker ]; then
## THEN NOTIFY TERMINAL THAT TEMP HAS EXCEEDED THRESHOLD TEMP
echo "$($tput $setaf $xyellow)###################################################"
echo "$($tput $setaf $xwhite) Exceeding Temp of: $($tput $setaf $xcyan)"$tempStart$tempSuffix
echo "$($tput $setaf $xyellow)###################################################"
## NOTIFY USER THAT MACHINE IS ENABLING THE ACPI FAN... (REQUIRES SUDO TO DO)
echo "$($tput $setaf $xred)======================================================="
echo "$($tput $setaf $xcyan)-------------- Checking the ACPI Fan."
echo "$($tput $setaf $xwhite)====================================================="
## THEN ENABLE THE FAN UNTIL;
## but before enabling the fan... we must check to see if it is already active...
## no point turning on a lightbulb when its already on...
if [ $Fan0_Status -eq $Fan0_On ]; then
echo "$($tput $setaf $xyellow)/////////////////////////////////////////////"
echo "$($tput $setaf $xwhite) ERROR! --- ACPI Fan 0: Already Enabled!"
echo "$($tput $setaf $xyellow)/////////////////////////////////////////////"
elif [ $Fan0_Status -eq $Fan0_Off ]; then
echo $Fan0_On > $Fan0_File
echo "$($tput $setaf $xyellow)/////////////////////////////////////////////"
echo "$($tput $setaf $xwhite) ACPI Fan 0: Enabling..."
echo "$($tput $setaf $xyellow)/////////////////////////////////////////////"
fi
echo "----------------------------------------------------"
## Until Loop: https://stackoverflow.com/questions/29692893/read-variable-until-output-is-greater-than-a-certain-value-in-bash
#-------------------------------------------------------------------------------------------------------------
until [ ${Core0Temp1} -lt $tempStart ]; do
sleep 1
## CORE 0 TEMP RETURNS TO LESS THAN THE THRESHOLD TEMP;
## RUN EVERY SECOND
## ON EVERY SECOND GET UPDATED TEMP VALUES
## AND ON EVERY SECOND GET THE ACPI FAN CURRENT STATUS (SUDO NEEDED!)
Fan0_Status=$(cat $Fan0_File)
if [ $Fan0_Status -eq $Fan0_On ]; then
sleep 1
echo "$($tput $setaf $xyellow)/////////////////////////////////////////////"
echo "$($tput $setaf $xwhite) ACPI_FAN0 IS ENABLED"
echo "$($tput $setaf $xyellow)/////////////////////////////////////////////"
elif [ $Fan0_Status -eq $Fan0_Off ]; then
sleep 1
echo "$($tput $setaf $xyellow)/////////////////////////////////////////////"
echo "$($tput $setaf $xwhite) ACPI_FAN0 IS DISABLED"
echo "$($tput $setaf $xyellow)/////////////////////////////////////////////"
fi
Core0Temp=$(sensors | grep -i "Core 0:" | awk '{print $3}')
Core0Temp1=$(echo "$Core0Temp" | sed -e "s/^$tempPrefix//" -e "s/$tempSuffix$//")
## DISPLAY THE UPDATED TEMP VALUES TO THE TERMINAL
echo "Core 0 Temp IS: "$Core0Temp1""$tempSuffix
## THEN ALSO EVERY SECOND, RUN A CHECK TO SEE IF THE TEMP
## HAS RETURNED TO LESS THAN THE THRESHOLD TEMP
if [ $Core0Temp1 -lt $tempStart ]; then
## IF THE TEMP HAS RETURNED TO LESS THAN THE THRESHOLD TEMP
## THEN DISABLE THE FAN AND NOTIFY TERMINAL
## but again, run a check to first see if it is active.
## you cant turn of a light thats already off right? ;)
## if active then disable. if not, then dont. cause its off.
if [ $Fan0_Status -eq $Fan0_Off ]; then
echo "$($tput $setaf $xyellow)/////////////////////////////////////////////"
echo "$($tput $setaf $xwhite)/ ERROR! /"
echo "$($tput $setaf $xyellow)/////////////////////////////////////////////"
echo "$($tput $setaf $xwhite)/ ACPI Fan 0: Already Disabled! /"
echo "$($tput $setaf $xyellow)/////////////////////////////////////////////"
elif [ $Fan0_Status -eq $Fan0_On ]; then
echo $Fan0_Off > $Fan0_File
echo "$($tput $setaf $xcyan)###################################################" #
echo "$($tput $setaf $xyellow)------------ACPI Fan 0: Disabled ./"
echo "$($tput $setaf $xcyan)###################################################" #
fi
echo "$($tput $setaf $xwhite)###################################################"
echo "$($tput $setaf $xcyan)--------- Core Temp Returned to: @"$tempStart""$tempSuffix
echo "$($tput $setaf $xwhite)###################################################"
fi
done
#-------------------------------------------------------------------------------------------------
#fi # this fi gets moved down under the return block.
#-------------------------------------------------------------------------------------------------
## So what do we do if the temp is less than the predefined temp?
## We repeat the until function but, in a reverse order.
## this is so that the script runs in a kind of (>---<>---<) see saw effect...
## back and fourth, to and fro right.
until [ ${Core0Temp1} -gt $tempStart ]; do
sleep 1
## CORE 0 TEMP RETURNS TO LESS THAN THE THRESHOLD TEMP;
## RUN EVERY SECOND
## ON EVERY SECOND GET UPDATED TEMP VALUES
## AND ON EVERY SECOND GET THE ACPI FAN CURRENT STATUS (SUDO NEEDED!)
Fan0_Status=$(cat $Fan0_File)
if [ $Fan0_Status -eq $Fan0_Off ]; then
sleep 1
echo "$($tput $setaf $xwhite)/////////////////////////////////////////////"
echo "$($tput $setaf $xwhite)--------------------ACPI_FAN0 IS DISABLED./"
echo "$($tput $setaf $xwhite)/////////////////////////////////////////////"
elif [ $Fan0_Status -eq $Fan0_On ]; then
sleep 1
echo "$($tput $setaf $xwhite)/////////////////////////////////////////////"
echo "$($tput $setaf $xwhite)--------------------ACPI_FAN0 IS ENABLED/./"
echo "$($tput $setaf $xwhite)/////////////////////////////////////////////"
fi
Core0Temp=$(sensors | grep -i "Core 0:" | awk '{print $3}')
Core0Temp1=$(echo "$Core0Temp" | sed -e "s/^$tempPrefix//" -e "s/$tempSuffix$//")
## DISPLAY THE UPDATED TEMP VALUES TO THE TERMINAL
echo "$($tput $setaf $xwhite)==============================================="
echo "$($tput $setaf $xwhite) Core 0 Temp IS: "$Core0Temp1""$tempSuffix
echo "$($tput $setaf $xwhite)==============================================="
## THEN ALSO EVERY SECOND, RUN A CHECK TO SEE IF THE TEMP
## HAS RETURNED TO LESS THAN THE THRESHOLD TEMP
if [ $Core0Temp1 -gt $tempStart ]; then
## IF THE TEMP HAS RETURNED TO greater THAN THE THRESHOLD TEMP
## THEN ENABLE THE FAN AND NOTIFY TERMINAL
## but again, run a check to first see if it is active.
## you cant turn ON a light thats already ON right? ;)
## if active then disable. if not, then dont. cause its off.
if [ $Fan0_Status -eq $Fan0_On ]; then
echo "$($tput $setaf $xyellow)/////////////////////////////////////////////"
echo "$($tput $setaf $xwhite) ERROR! /"
echo "$($tput $setaf $xyellow)/////////////////////////////////////////////"
echo "$($tput $setaf $xwhite) ACPI Fan 0: Already Enabled! /"
echo "$($tput $setaf $xyellow)/////////////////////////////////////////////"
elif [ $Fan0_Status -eq $Fan0_Off ]; then
echo $Fan0_On > $Fan0_File
echo "$($tput $setaf $xred)-------------------------------------------" #
echo "$($tput $setaf $xwhite)................ACPI Fan 0: Enabled.."
echo "$($tput $setaf $xred)-------------------------------------------" #
fi
echo "$($tput $setaf $xred)###################################################"
echo "$($tput $setaf $xwhite)............Core Temp dropping below: @"$tempStart""$tempSuffix
echo "$($tput $setaf $xred)###################################################"
echo "$($tput $reset)"
fi
done
#-------------------------------------------------------------------------------------------------
fi
done
#END OF SUPERSCRIPT.