这是该问题的一个彻底更新的版本。我必须更新它,因为这个问题被标记为该问题的重复,但该问题已不再有有效答案。
- 该问题的初始版本带有 11.04 标签:
我是脚本和 Linux 的新手,我的电脑有时会过热,我想编写一个脚本来检测 temp1,如果温度超过 65 C,就必须将其置于休眠状态。我在比较脚本中的值时遇到了困难,我无法正确定义数字,有人能解决这个问题吗?这是我迄今为止的尝试
#!/bin/bash
max=65
val=$ sensors | grep '^temp1:' | sed -e 's/.*: \+\([+-][0-9.]\+\)°C.*$/0\1/'
while true; do
if [[ "$val" > "$max" ]]; then
sudo /etc/acpi/sleep.sh force
sleep 1
else
sleep 10
fi
clear
sensors
done
以上得到一个答案根据评论,这个脚本在某个时候已更新至 14.04:
#!/bin/bash
while true; do
val=$(sensors | awk '/temp1/ {print $2}')
max="+75.0"
if [[ "$val" > "$max" ]]; then
dbus-send --system --print-reply --dest="org.freedesktop.UPower" /org/freedesktop/UPower org.freedesktop.UPower.Suspend
fi
sleep 10
clear
sensors
done
exit 0
正如链接问题所指出的,上述脚本在 16.04 中不起作用。
这个问题一个答案使用简单修改后的脚本版本:
#!/bin/bash
while true; do
val=$(sensors | awk '/temp1/ {print $2}')
max="+75.0"
if [[ "$val" > "$max" ]]; then
systemctl suspend
fi
clear
sensors
done
exit 0
但是,虽然它完成了工作(当温度超过 75 时系统会进入睡眠状态),但它消耗的 CPU 电量比预期的要多,并且在运行时将温度推高至 10 摄氏度;这更有用,在不运行时更凉爽!
我不知道问题是否出在最初的 11.04 脚本上或最后的更改上,但这需要针对 16.04 的全新答案。
答案1
我设法制作了自己的剧本。
#!/bin/bash
while true; do
val=$(sensors | awk '/temp1/ {print $2}')
max="+75.0"
if [[ "$val" > "$max" ]]; then
dbus-send --system --print-reply --dest="org.freedesktop.UPower" /org/freedesktop/UPower org.freedesktop.UPower.Suspend
fi
sleep 10
clear
sensors
done
exit 0
对于 16.04(也这里):
#!/bin/bash
while true; do
val=$(sensors | awk '/temp1/ {print $2}')
max="+75.0"
if [[ "$val" > "$max" ]]; then
systemctl suspend
fi
sleep 10
clear
sensors
done
exit 0
答案2
介绍
为了方便 systemd 切换前和切换后的用户,我编写了一个脚本,它将根据您的操作系统版本号采用适当的暂停方法。本质上,它与 OP 更新的脚本所做的相同,只是它会强制暂停,尽管有带有-i
标志的抑制剂。可以对脚本进行多项考虑和改进,但就目前而言,这个版本完成了 90% 的工作。
我在 16.04 LTS 上进行了简单测试,运行良好。将来我可能会用 Python 重写它,因为我可以或者根据用户要求。
脚本源
#!/usr/bin/env bash
suspend_system(){
os_version=$(awk -F'["=]' '/VERSION_ID/{print substr($3,1,2)}' /etc/os-release)
if [ $os_version -ge 15 ]
then
systemctl suspend -i
# Alternative way is to call login manager method via dbus
# qdbus --system org.freedesktop.login1 /org/freedesktop/login1 \
# org.freedesktop.login1.Manager.Suspend True
else
dbus-send --system --print-reply --dest="org.freedesktop.UPower"\
/org/freedesktop/UPower org.freedesktop.UPower.Suspend
fi
}
is_critical_temp(){
local temp=$(sensors | awk '/temp1/ {print substr($2,2,2)}')
if [ $temp -gt 75 ]
then
return 0
else
return 1
fi
}
main(){
while true
do
if is_critical_temp
then
# optional dialog if running from GUI, not necessary if running form /etc/rc.local
#zenity --info --text "Reached critical temperature. Suspending in 10 seconds" &
sleep 10
suspend_system
fi
sleep 3
done
}
main "$@"
替代方法
不久前,我pm-suspend
在软件包中找到了实用程序pm-utils
。无论操作系统版本如何,此程序都可以正常工作。小缺点是它需要 root 访问权限,但很容易解决这一不便。
我个人会做以下事情:
sudo apt-get install pm-utils
sudo visudo
并yourusername ALL = NOPASSWD: /usr/sbin/pm-suspend
在文件末尾添加。- 编辑脚本来调用
sudo pm-suspend
而不是 dbus 命令。
暂停 Ubuntu 机器的一般方法
您要求答案来自可靠的来源。事实上,Ask Ubuntu 确实有关于从命令行暂停的规范帖子:如何从命令行暂停/休眠?根据您希望脚本拥有的方法和权限级别,有多种方法可以解决此问题。有些方法比其他方法更有效。在我的回答中,我提供了 dbus 和 systemctl 方法,因为它们也适用于屏幕锁定。如果您写入/sys/class/power/state
,它不会锁定屏幕,尽管可以使用一些脚本魔法来解决这个问题。目前,我认为更好的方法是简单地确定操作系统版本并选择适当的方法(如我的脚本中所示),或者使用pm-suspend
替代方法。
答案3
在我的系统上,每次sensors
运行时视频流都会出现卡顿。每 10 秒发生一次这种情况,或者无论建议的脚本运行多少次,都会让我发疯。更好的暂停解决方案是使用英特尔的thermald和强力夹钳降低 CPU 速度以减少热量。我在另一个问题中写了这个答案(防止 CPU 过热),为方便起见,我将其复制到此处。
此外,上述脚本依赖于temp1
在我的 Ubuntu 16.04 上经常损坏并且只有temp3
100% 可靠的脚本不会显示sensors
。即:
$ cat /sys/class/thermal/thermal_zone*/temp
27800
29800
58000
来自sensors
:
acpitz-virtual-0
Adapter: Virtual device
temp1: +27.8°C (crit = +106.0°C)
temp2: +29.8°C (crit = +106.0°C)
这发生在暂停/恢复之后。真实的温度为 +58.0°C,但在恢复后被错误地报告为 +27.8°C。因此,热保护只会在暂停时起作用一次,直到重新启动后才会再次起作用。因此,系统将达到临界温度 (+106.0°C),此时将执行硬关机,数据可能会损坏。
因此,我推荐的解决方案是防止过热并利用 CPU 减速而不是彻底暂停系统。
降低CPU速度以减少热量
这适用于配备 Intel Sandy Bridge 和较新处理器的 Ubuntu 16.04+。
从 (wiki.debian.org-thermald)是 Debian(Ubuntu 使用)关于thermald,用于冷却平板电脑和笔记本电脑的 Linux 守护进程。一旦系统温度达到某个阈值,Linux 守护进程就会启动各种冷却方法来冷却系统。
Linux 热守护进程 (thermald) 监控和控制配备最新 Intel sandy bridge 和最新 Intel CPU 版本的笔记本电脑、平板电脑的温度。一旦系统温度达到某个阈值,Linux 守护进程就会启动各种冷却方法来尝试冷却系统。
它以两种模式运行:
零配置模式
- 对于大多数用户来说,这足以控制系统的 CPU 温度。它使用 DTS 温度传感器,并使用英特尔 P 状态驱动程序、功率钳位驱动程序、运行平均功率限制控制和 cpufreq 作为冷却方法。
用户定义配置模式
- 这允许在热 XML 配置文件中进行 ACPI 样式配置。这可用于修复有缺陷的 ACPI 配置或通过添加更多传感器和冷却设备进行微调。这是在用户模式下实现闭环热控制的第一步,可以根据社区反馈和建议进行增强。
如何安装
apt-get install thermald
英特尔 Powerclamp
英特尔强力夹钳驱动程序定义在这里(kernel.org - 英特尔功率钳位.txt)并且是thermald如上所述。直接引用强力夹钳来自链接:
考虑这样一种情况:由于功率预算、热约束或噪声水平,系统运行时必须降低功耗,并且不推荐主动冷却。必须执行软件管理的被动功率降低,以防止为灾难性场景设计的硬件操作。
目前,P 状态、T 状态(时钟调制)和 CPU 离线用于 CPU 节流。
在 Intel CPU 上,C 状态可有效降低功耗,但目前仅根据工作负载适时使用。随着 intel_powerclamp 驱动程序的开发,引入了在所有在线 CPU 线程上同步空闲注入的方法。目标是实现强制且可控的 C 状态驻留。
已在功耗、性能、可扩展性和用户体验方面进行了测试/分析。在许多情况下,与使 CPU 脱机或调节 CPU 时钟相比,它显示出明显的优势。
您如何知道 Powerclamp 正在运行?
强力夹钳每年可能只会出现一次,即风扇通风口积满灰尘和棉绒。那么你怎么知道它实际上是在后台运行的呢?使用:
lsmod | grep intel
您应该看到类似这样的列表:
btintel 16384 1 btusb
bluetooth 520192 29 bnep,btbcm,btrtl,btusb,rfcomm,btintel
intel_rapl 20480 0
intel_powerclamp 16384 0
(.... more intel drivers ....)
snd 81920 18 snd_hwdep,snd_timer,snd_hda_codec_hdmi,snd_hda_codec_idt,snd_pcm,snd_seq,snd_rawmidi,snd_hda_codec_generic,snd_hda_codec,snd_hda_intel,snd_seq_device
如果您看到intel_rapl
并且intel_powerclamp
知道它正在工作,只需等待温度超过 85C。
Conky 展示的 Powerclamp 实际操作
这是屏幕截图强力夹钳注射睡眠周期:
通常,在观看 HTML5 视频并打开 10 个 Chrome 标签时,此系统的 CPU 时钟速度为 2400 Mhz 至 3400 Mhz。通常,8 个 CPU 的 CPU 利用率约为 9% 至 12%。当情况变得太热时(86C)强力夹钳开始起作用,发生以下情况:
- CPU 速度降低至 1200 Mhz。
- CPU 利用率飙升至 80%。这是误导性的,因为额外的 70% 是睡眠时间。
- 前 9 个 CPU 进程通常是 5 或 6 个 Chrome 进程加上 Xorg、Conky、Pulse Audio 和偶尔的 kworker。但现在前 10 个中有 8 个是kidle_inject/x进程
x
从 0 到 7。针对前 8 个 CPU。
这强力夹钳驱动程序运行直至温度再次降至 85C 以下。驱动程序运行时,您的视频可能会瞬间暂停,键盘和鼠标也可能会瞬间延迟。
禁用英特尔睿频加速
回到 Ubuntu 14.04 的“酷炫旧时光”,当时 Intel Turbo Boost 坏了,所以我的处理器速度在 1200 Mhz 和 2400 Mhz 之间波动。升级到 Ubuntu 16.04 后,它会升至 3400 Mhz(3.4 Ghz),因为 Turbo Boost 终于可以正常工作了。但它也增加了热量。
要禁用 Intel Turbo Boost,请使用:
echo "1" | sudo tee /sys/devices/system/cpu/intel_pstate/no_turbo
答案4
我已经彻底编辑了上述问题,以便请求更新 16.04,因此我下面的回答只是对Kenn 的初步回答,我在上面发布了重复的问题并且还是回答在那之下。
由于 16.04 中的错误Error org.freedesktop.DBus.Error.UnknownMethod: No such method 'Suspend'
,在尼克西利托在下面我重复的问题链接到这答案是,我修改了脚本,替换了整个部分:
dbus-send --system --print-reply --dest="org.freedesktop.UPower" /org/freedesktop/UPower org.freedesktop.UPower.Suspend
和
systemctl suspend
正如评论中指出的那样怀安德雷亚在下面重复的问题:sleep 10
或者不应删除类似的值(正如我最初所做的那样);如果没有该行,修改后的脚本将使用更多的电量,因为它不是每 10 秒运行一次,而是尽可能快地运行 - 每秒运行几十次。
此时,当超过线路设置的水平时,系统将进入睡眠状态
max="+75.0"
因为我想要一个更高的值,82,所以我使用的脚本是:
#!/bin/bash
while true; do
val=$(sensors | awk '/temp1/ {print $2}')
max="+82.0"
if [[ "$val" > "$max" ]]; then
systemctl suspend
fi
sleep 10
clear
sensors
done
exit 0