香港討論區 »
LINUX 問題討論
» Fancontrol according to hard disk temperature 使 Linux 根據硬碟溫度控制風扇轉速
matthew_wai 2019-2-28 18:11
Thanks to “路寅甲”, I got a simple script to control fan speed according to hard drive temperature via [b][color=Blue][url=https://pkgs.org/download/fancontrol]Fancontrol[/url][/color][/b], [b][color=Blue][url=https://pkgs.org/download/hddtemp]Hddtemp[/url][/color][/b], and [b][color=Blue][url=https://www.archlinux.org/packages/?name=lm_sensors]Lm-sensors[/url][/color][/b]. In the following script, “[b][color=Red]/dev/sda[/color][/b]” is the hard disk to be monitored, and “[b][color=Red]/Fancontrol/Hddtemp[/color][/b]” is the output file to be read by Fancontrol. Press [b][color=Red]Ctrl[/color] + [color=Red]Alt[/color] + [color=Red]T[/color][/b] to open Terminal and run the following command to check whether “[b][color=Red]/dev/sda[/color][/b]” is the correct one:[code]sudo hddtemp /dev/sd[a-z][/code]Use only the one supported by Hddtemp, which will display the temperature rather than “S.M.A.R.T. not available”.
Replace “[b][color=Red]/dev/sda[/color][/b]” with the correct one in the script if necessary.
If you have not yet configured Fancontrol, see [b][color=Blue][url=https://wiki.archlinux.org/index.php/fan_speed_control]this page[/url][/color][/b], [b][color=Blue][url=https://askubuntu.com/questions/22108/]this page[/url][/color][/b], and [b][color=Blue][url=http://tuxtweaks.com/2008/08/how-to-control-fan-speeds-in-ubuntu/]this page[/url][/color][/b] and run the following commands one by one (restart Linux after running the first one):
[b][color=#ff0000]sudo sensors-detect
watch sensors
sudo pwmconfig
sudo service fancontrol start[/color][/b]
Then, go through the procedure below:
(1) Run the following command to create a script file.
[b][color=Red]sudo mkdir -p "/Fancontrol/" & sudo xed /Fancontrol/HDD_temp[/color][/b]
[color=#ff0000][/color](2) Copy the following script into the file and save it.
[b][color=#ff0000]#!/bin/bash[/color][/b]
[b][color=#ff0000]F=/Fancontrol/Hddtemp[/color][/b]
[b][color=#ff0000]while true[/color][/b]
[b][color=#ff0000]do [/color][/b]
[b][color=#ff0000]T=$(sudo hddtemp -n /dev/sda)[/color][/b]
[b][color=#ff0000]echo $(($T * 1000)) > "$F"[/color][/b]
[b][color=#ff0000]sleep 30 [/color][/b]
[b][color=#ff0000]done[/color][/b]
(3) Run the following command to make it executable.
[color=#ff0000][b]sudo chmod +x /Fancontrol/HDD_temp[/b][/color]
[color=#ff0000][/color](4) Run the following command to create a service file.
[b][color=Red]sudo xed /lib/systemd/system/HDD_temp.service[/color][/b]
[color=#ff0000][/color](5) Copy the following lines into the file and save it.
[b][color=#ff0000][Service][/color][/b]
[b][color=#ff0000]ExecStart=/Fancontrol/HDD_temp
[Install]
WantedBy=multi-user.target[/color][/b]
(6) Run the following commands one by one:
[b][color=Red]sudo chmod 664 /lib/systemd/system/HDD_temp.service
sudo systemctl daemon-reload
sudo systemctl start HDD_temp.service
sudo systemctl enable HDD_temp.service [/color][/b]
Then, the script “[b][color=Red]HDD_temp[/color][/b]” will be run as a system service at Linux startup.
(7) Run the following command to edit “[b][color=Red]fancontrol[/color][/b]”, the configuration file.
[b][color=Red]sudo xed /etc/fancontrol[/color][/b]
Find the line that begins with “[b][color=Red]FCTEMPS[/color][/b]”. For example:
[b][color=Red]FCTEMPS=hwmon1/pwm1=hwmon1/temp1_input[/color][/b]
On that line, [b][color=Red]hwmon1/temp1_input[/color][/b] is the temperature (e.g. the chipset temperature) currently read by Fancontrol. Replace it with [b][color=Red]/Fancontrol/Hddtemp[/color][/b], and the line will become:
[b][color=Red]FCTEMPS=hwmon1/pwm1=/Fancontrol/Hddtemp[/color][/b]
Save the file and run the following command to restart Fancontrol.
[b][color=Red]sudo service fancontrol restart[/color][/b]
Then, the fan controlled by “[b][color=Red]hwmon1/pwm1[/color][/b]” will respond to “[b][color=Red]/Fancontrol/Hddtemp[/color][/b]”, the hard disk temperature. Note that "HDD_temp" and "Hddtemp" are the script file and output file respectively. Don't confuse them.
[[i] 本帖最後由 matthew_wai 於 2019-5-16 01:54 AM 編輯 [/i]]
路寅甲 2019-3-1 12:30
UNIX script開頭要有#!, 以指定執行script的程式, 例如bash
script應放在PATH指定的Folder, /var/lib/不在PATH內, 且根據script內容睇, LOCATION=/var/lib/Fancontrol_Hddtemp是個directory, 並非script本身, 是用作記錄HDD溫度, 給fancontrol daemon參考
如要在啟動系統時自動執行該script, 另外要寫個systemd service file, 然後行systemctl enable <file>
matthew_wai 2019-3-1 14:13
[b][color=Blue][url=https://computer.discuss.com.hk/viewthread.php?tid=28063756&page=1#pid495536111]See post #1.[/url][/color][/b]
[[i] 本帖最後由 matthew_wai 於 2019-3-6 03:57 PM 編輯 [/i]]
路寅甲 2019-3-1 15:06
[quote]原帖由 [i]matthew_wai[/i] 於 2019-3-1 02:13 PM 發表 [url=https://computer.discuss.com.hk/redirect.php?goto=findpost&pid=495569874&ptid=28063756][img]https://computer.discuss.com.hk/images/common/back.gif[/img][/url]
Thank you very much, 路寅甲.
I have just added “#!/bin/bash -e” atop the script, which works now. However, it reads “38000” when the actual temperature is 38°C. How should ... [/quote]
可用
[b]echo $maximum | bc > "$FILE_MAX".write[/b]
但x1000可能是fancontrol所需的format, 可查一下temp1_input是否也x1000,
[root@host hwmon2]# cat /sys/class/hwmon/hwmon2/temp1_input
35000
matthew_wai 2019-3-1 15:31
[quote]原帖由 [i]路寅甲[/i] 於 2019-3-1 03:06 PM 發表 [url=https://computer.discuss.com.hk/redirect.php?goto=findpost&pid=495572160&ptid=28063756][img]https://computer.discuss.com.hk/images/common/back.gif[/img][/url]
[root@host hwmon2]# cat /sys/class/hwmon/hwmon2/temp1_input
35000 [/quote]
Sorry, I don't understand it. What should I do with it? Run it on Terminal or via a script?
路寅甲 2019-3-1 16:00
command to check run time value of [quote]原帖由 [i]matthew_wai[/i] 於 2019-3-1 03:31 PM 發表 [url=https://computer.discuss.com.hk/redirect.php?goto=findpost&pid=495573189&ptid=28063756][img]https://computer.discuss.com.hk/images/common/back.gif[/img][/url]
Sorry, I don't understand it. What should I do with it? Run it on Terminal or via a script? [/quote]
Terminal, command to check runtime value of temp1_input
cat /sys/class/hwmon/hwmon2/temp1_input
[[i] 本帖最後由 路寅甲 於 2019-3-1 04:02 PM 編輯 [/i]]
matthew_wai 2019-3-1 16:04
[color=#ff0000]matthew@matthew-pc:~$ cat /sys/class/hwmon/hwmon2/temp1_input[/color]
[color=#ff0000]35000[/color]
[[i] 本帖最後由 matthew_wai 於 2019-3-6 03:58 PM 編輯 [/i]]
路寅甲 2019-3-1 16:29
commented out items relating to average calculation
also taken the maximum=0 out out while loop, so that $maximun is not cleared every loop
複製內容到剪貼板
代碼:
......
LOCATION=/var/lib/Fancontrol_Hddtemp
FILE_MAX="$LOCATION"/Fancontrol_Hddtemp-maximum
# FILE_AVG="$LOCATION"/Fancontrol_Hddtemp-average
DEGUG=0
[[ -e $LOCATION ]] || mkdir "$LOCATION"
maximum=0
while true
do
temperature=0
# summation=0
# average=0
# count=0
for value in $(hddtemp -n $DISKS 2>/dev/null)
do
[[ $value != [0-9]* ]] && continue
temperature="${value//[!0-9]}"
# ((summation+=$temperature))
# ((count+=1))
if [ $temperature -gt $maximum ]; then
maximum=$temperature
fi
if [ $DEGUG = 1 ]; then
# average=$(echo "scale=1; $summation / $count" | bc)
# echo $summation
echo $maximum
# echo $average
# echo $count
echo "-----"
fi
done
# average=$(echo "scale=1; $summation / $count" | bc)
# fancontrol output format
echo "($maximum * 1000)/1" | bc > "$FILE_MAX".write
# echo "($average * 1000)/1" | bc > "$FILE_AVG".write
mv --force "$FILE_MAX".write "$FILE_MAX"
# mv --force "$FILE_AVG".write "$FILE_AVG"
sleep 45
done
exit
路寅甲 2019-3-1 17:40
[quote]原帖由 [i]路寅甲[/i] 於 2019-3-1 04:29 PM 發表 [url=https://www.discuss.com.hk/redirect.php?goto=findpost&pid=495575610&ptid=28063756][img]https://www.discuss.com.hk/images/common/back.gif[/img][/url]
commented out items relating to average calculation
also taken the maximum=0 out out while loop, so that $maximun is not cleared every loop
複製內容到剪貼板
代碼:
......
LOCATION=/var/lib/Fancontrol_Hd ... [/quote]
睇清maximum係指最高溫嗰隻disk, 所以拉出while loop係錯
要原來咁每個loop清零,留返係while裡面
matthew_wai 2019-3-1 18:10
[b][color=Blue][url=https://computer.discuss.com.hk/viewthread.php?tid=28063756&page=1#pid495536111]See post #1.[/url][/color][/b]
[[i] 本帖最後由 matthew_wai 於 2019-3-6 03:58 PM 編輯 [/i]]
matthew_wai 2019-3-1 21:08
[b][color=Blue][url=https://computer.discuss.com.hk/viewthread.php?tid=28063756&page=1#pid495536111]See post #1.[/url][/color][/b]
[[i] 本帖最後由 matthew_wai 於 2019-3-6 03:59 PM 編輯 [/i]]
路寅甲 2019-3-2 09:15
[quote]原帖由 [i]matthew_wai[/i] 於 2019-3-1 09:08 PM 發表 [url=https://computer.discuss.com.hk/redirect.php?goto=findpost&pid=495587948&ptid=28063756][img]https://computer.discuss.com.hk/images/common/back.gif[/img][/url]
Assuming "~/folder/HDD_temp" is the path to the script, how should I create such a file? The script has to be run before Fancontrol is started. Otherwise, Fancontrol has to be restarted. [/quote]
簡單起見, 我將個script同fancontrol package放埋一齊, /usr/sbin/fancontrol-via-hddtemp
boot機時自動執行shell script嘅方法可參考
[url=https://linuxconfig.org/how-to-automatically-execute-shell-script-at-startup-boot-on-systemd-linux]https://linuxconfig.org/how-to-automatically-execute-shell-script-at-startup-boot-on-systemd-linux[/url]
係呢個case, 因為安裝fancontrol時已帶有systemd unit file, 可以試作為參考, (同上邊條link擺放unit file嘅direcoty不同, 無問題)
1. 睇 fancontrol 的 systemd unit file ( cat /lib/systemd/system/fancontrol.service )
[Unit]
Description=fan speed regulator
# Run pwmconfig to create this file.
ConditionPathExists=/etc/fancontrol
After=lm-sensors.service
Documentation=man:fancontrol(8) man:pwmconfig(8)
[Service]
ExecStartPre=/usr/sbin/fancontrol --check
ExecStart=/usr/sbin/fancontrol
PIDFile=/var/run/fancontrol.pid
[Install]
WantedBy=multi-user.target
2. 複製並修改做 /lib/systemd/system/fancontrol-via-hddtemp.service
[Unit]
Description=fan speed regulator via hdd temp
After=lm-sensors.service
Before=fancontrol.service
[Service]
ExecStart=/usr/sbin/fancontrol-via-hddtemp
PIDFile=/var/run/fancontrol-via-hddtemp.pid
[Install]
WantedBy=multi-user.target
完成後好似上邊條link講咁reload systemd daemon ...
# systemctl daemon-reload
# systemctl enable fancontrol-via-hddtemp.service
# reboot
[[i] 本帖最後由 路寅甲 於 2019-3-2 02:33 PM 編輯 [/i]]
路寅甲 2019-3-2 09:17
[quote]原帖由 [i]matthew_wai[/i] 於 2019-3-1 06:10 PM 發表 [url=https://computer.discuss.com.hk/redirect.php?goto=findpost&pid=495580395&ptid=28063756][img]https://computer.discuss.com.hk/images/common/back.gif[/img][/url]
Assuming there are three disks, “maximum” refers to the hottest one, and “average” refers to their average. Am I right?
Please read the modified script below. Do you think the ... [/quote]
yes,
"average" is not used by fancontrol, you can delete all those items
matthew_wai 2019-3-2 15:58
[b][color=Blue][url=https://computer.discuss.com.hk/viewthread.php?tid=28063756&page=1#pid495536111]See post #1.[/url][/color][/b]
[[i] 本帖最後由 matthew_wai 於 2019-3-6 04:01 PM 編輯 [/i]]
路寅甲 2019-3-2 17:11
[quote]原帖由 [i]matthew_wai[/i] 於 2019-3-2 03:58 PM 發表 [url=https://computer.discuss.com.hk/redirect.php?goto=findpost&pid=495621633&ptid=28063756][img]https://computer.discuss.com.hk/images/common/back.gif[/img][/url]
I have created the following files:
/usr/sbin/fancontrol-via-hddtemp
/lib/systemd/system/fancontrol-via-hddtemp.service
Should I run the following commands on Terminal?
Why is there # before ... [/quote]
#通常係bash prompt最後一個字母, 後面跟住嘅係正式command, 入command唔使#
所以第4個唔係command, 係第3個command執行後顯示嘅結果
第一句command如果個file係從其它service file複製出嚟再修改就唔使, 如果放係/lib/systemd/systm/內, 應跟返其它文件用644權限
第3個command你打漏咗enable :
systemctl enable fancontrol-via-hddtemp.service
[[i] 本帖最後由 路寅甲 於 2019-3-2 05:18 PM 編輯 [/i]]
matthew_wai 2019-3-2 18:42
[b][color=Blue][url=https://computer.discuss.com.hk/viewthread.php?tid=28063756&page=1#pid495536111]See post #1.[/url][/color][/b]
[[i] 本帖最後由 matthew_wai 於 2019-3-6 04:02 PM 編輯 [/i]]
matthew_wai 2019-3-2 20:47
[b][color=Blue][url=https://computer.discuss.com.hk/viewthread.php?tid=28063756&page=1#pid495536111]See post #1.[/url][/color][/b]
[[i] 本帖最後由 matthew_wai 於 2019-3-6 04:03 PM 編輯 [/i]]
matthew_wai 2019-3-3 22:21
[b][color=Blue][url=https://computer.discuss.com.hk/viewthread.php?tid=28063756&page=1#pid495536111]See post #1.[/url][/color][/b]
[[i] 本帖最後由 matthew_wai 於 2019-3-6 04:04 PM 編輯 [/i]]
路寅甲 2019-3-4 12:41
[quote]原帖由 [i]matthew_wai[/i] 於 2019-3-3 10:21 PM 發表 [url=https://computer.discuss.com.hk/redirect.php?goto=findpost&pid=495687633&ptid=28063756][img]https://computer.discuss.com.hk/images/common/back.gif[/img][/url]
The script will output "maximum".
When one HDD is connected, the output is 40000, which is normal.
When two HDDs are connected, the output is 1600000, which is impossible.
When I have removed the U ... [/quote]
我試咗插隻USB然後run個script係正常,
USB本身冇sensor, 但獲取溫度嘅指令會彈出一句
[okla@host ~]$ hddtemp -n /dev/sdd 2>/dev/null
/dev/sdd: Generic STORAGE DEVICE: S.M.A.R.T. not available
for loop會一個個詞咁check, 如果呢個output包含有數字, 就會被當作溫度處理, 出現錯誤結果
可試解決辦法是讓for loop將hddtemp輸出指令成個一齊check係唔係數字,
將separator定義為"new line", 而並非預定嘅"space"
#!/bin/bash -e
PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/bin/
[color=red]IFS='
'[/color]
[color=#ff0000][color=black]......[/color][/color]
matthew_wai 2019-3-4 13:01
[b][color=Blue][url=https://computer.discuss.com.hk/viewthread.php?tid=28063756&page=1#pid495536111]See post #1.[/url][/color][/b]
[[i] 本帖最後由 matthew_wai 於 2019-3-6 04:04 PM 編輯 [/i]]
路寅甲 2019-3-4 13:06
[quote]原帖由 [i]matthew_wai[/i] 於 2019-3-4 01:01 PM 發表 [url=https://computer.discuss.com.hk/redirect.php?goto=findpost&pid=495714027&ptid=28063756][img]https://computer.discuss.com.hk/images/common/back.gif[/img][/url]
Do you mean the command is on two lines?
My USB HDD has a sensor.
My SATA HDD is "/dev/sda/". Is it possible to use only the "/dev/sda/" sensor to the exclusion of all others? If so, the script ... [/quote]
係2行, quote 個 new line, 留意兩個' '中間冇任何space, 只是個return分行
show嚟睇睇, 假設usb是/dev/sdb :
hddtemp -n /dev/sdb 2>/dev/null
[[i] 本帖最後由 路寅甲 於 2019-3-4 01:10 PM 編輯 [/i]]
matthew_wai 2019-3-4 13:14
[b][color=Blue][url=https://computer.discuss.com.hk/viewthread.php?tid=28063756&page=1#pid495536111]See post #1.[/url][/color][/b]
[[i] 本帖最後由 matthew_wai 於 2019-3-6 04:05 PM 編輯 [/i]]
路寅甲 2019-3-4 13:24
[quote]原帖由 [i]matthew_wai[/i] 於 2019-3-4 01:14 PM 發表 [url=https://computer.discuss.com.hk/redirect.php?goto=findpost&pid=495714656&ptid=28063756][img]https://computer.discuss.com.hk/images/common/back.gif[/img][/url]
My SATA HDD is "/dev/sda".
My USB HDD is "/dev/sde".
matthew@matthew-pc:~$ hddtemp -n /dev/sda 2>/dev/null
matthew@matthew-pc:~$ hddtemp -n /dev/sde 2>/dev/null
matthew@matthew-pc:~$ ... [/quote]
[okla@host ~]$ hddtemp -n /dev/sda 2>/dev/null
33
[okla@host ~]$ hddtemp -n /dev/sdb 2>/dev/null
33
[okla@host ~]$ hddtemp -n /dev/sdc 2>/dev/null
32
[okla@host ~]$ hddtemp -n /dev/sdd 2>/dev/null
/dev/sdd: Generic STORAGE DEVICE: S.M.A.R.T. not available
個command係script內用作獲取HDD溫度, 如果你部機出唔到, 硬件有問題?
路寅甲 2019-3-4 13:30
若只想用sda溫度, 將DISKS改下, 其餘部份雖有多餘coding, 可留以後有慢慢研究
DISKS="/dev/sda"
或將while loop簡化下,
while true
do
temperature=$(hddtemp -n /dev/sda 2>/dev/null)
[[ $temperature != [0-9]* ]] && continue
# fancontrol output format
echo "($temperature * 1000)/1" | bc > "$FILE_MAX".write
mv --force "$FILE_MAX".write "$FILE_MAX"
sleep 45
done
[[i] 本帖最後由 路寅甲 於 2019-3-4 01:45 PM 編輯 [/i]]
matthew_wai 2019-3-4 14:08
[quote]原帖由 [i]路寅甲[/i] 於 2019-3-4 01:24 PM 發表 [url=https://computer.discuss.com.hk/redirect.php?goto=findpost&pid=495715112&ptid=28063756][img]https://computer.discuss.com.hk/images/common/back.gif[/img][/url]
個command係script內用作獲取HDD溫度, 如果你部機出唔到, 硬件有問題?[/quote]
See the screenshot below.
[b][color=#ff0000]WDC WD1600BEVS-22UST0[/color][/b] is my USB HDD.
[b][color=#ff0000]ST3500418AS[/color][/b] is my SATA HDD.
[attach]9395254[/attach]
[[i] 本帖最後由 matthew_wai 於 2019-3-4 02:09 PM 編輯 [/i]]
路寅甲 2019-3-4 14:24
[quote]原帖由 [i]matthew_wai[/i] 於 2019-3-4 02:08 PM 發表 [url=https://computer.discuss.com.hk/redirect.php?goto=findpost&pid=495717116&ptid=28063756][img]https://computer.discuss.com.hk/images/common/back.gif[/img][/url]
See the screenshot below.
WDC WD1600BEVS-22UST0 is my USB HDD.
ST3500418AS is my SATA HDD.
9395254 [/quote]
How about :
[okla@host ~]$ hddtemp /dev/sda
/dev/sda: KINGSTON SUV400S37240G: 33°C
[okla@host ~]$ hddtemp /dev/sdd
/dev/sdd: Generic STORAGE DEVICE: S.M.A.R.T. not available
matthew_wai 2019-3-4 14:24
My SATA HDD is "[b][color=#ff0000]/dev/sda[/color][/b]".
My USB HDD is "[b][color=#ff0000]/dev/sde[/color][/b]".
[b][color=#ff0000][b][color=#ff0000][/color][/b]
matthew@matthew-pc:~$ sudo hddtemp -n /dev/sda
38
matthew@matthew-pc:~$ sudo hddtemp -n /dev/sde
/dev/sde: WD 1600BEV External: S.M.A.R.T. not available[/color][/b]
matthew_wai 2019-3-4 14:27
[b][color=#ff0000]matthew@matthew-pc:~$ sudo hddtemp /dev/sda
/dev/sda: ST3500418AS: 38°C
matthew@matthew-pc:~$ sudo hddtemp /dev/sde
/dev/sde: WD 1600BEV External: S.M.A.R.T. not available[/color][/b]
路寅甲 2019-3-4 14:32
[quote]原帖由 [i]matthew_wai[/i] 於 2019-3-4 02:27 PM 發表 [url=https://computer.discuss.com.hk/redirect.php?goto=findpost&pid=495718019&ptid=28063756][img]https://computer.discuss.com.hk/images/common/back.gif[/img][/url]
matthew@matthew-pc:~$ sudo hddtemp /dev/sda
/dev/sda: ST3500418AS: 38°C
matthew@matthew-pc:~$ sudo hddtemp /dev/sde
/dev/sde: WD 1600BEV External: S.M.A.R.T. not available [/quote]
It is normal now, U can see, there is a number 1600 in the /dev/sde output
So you can try the above mentioned solution
matthew_wai 2019-3-4 17:08
[b][color=Blue][url=https://computer.discuss.com.hk/viewthread.php?tid=28063756&page=1#pid495536111]See post #1.[/url][/color][/b]
[[i] 本帖最後由 matthew_wai 於 2019-3-6 04:06 PM 編輯 [/i]]