アクティブコア温度を監視するために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/
に3つのサブディレクトリがあります。私の場合、このモジュールは次のようになります。システムによって異なる場合があります。単に実行して各サブディレクトリを識別できます。ここで、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
実際の数字と異なる場合があります。この値は摂氏1000分の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ビジネスノートブックへの深刻なバグ修正です!その他 - おそらく、このタイプのノートブックを使用している他のユーザーはこの機能が役に立つと思うかもしれません。 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.