Это радикально обновленная версия вопроса. Я должен обновить это, потому что этот вопрос помечен как дубликат этого, в то время как на этот вопрос больше нет действительного ответа.
Я новичок в сценариях и Linux, мой комп иногда перегревается и я хочу создать скрипт для определения temp1, и если он превышает 65 градусов, он должен перевести его в спящий режим. У меня есть трудности в сравнении значений в сценарии, я не смог правильно определить цифры, кто-нибудь может это исправить, пожалуйста? Вот мой пример:
#!/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), он потребляет больше ресурсов процессора, чем ожидалось, и повышает температуру при работе до 10 градусов по Цельсию; это более полезно, больше охлаждения, когда не работает!
Я не знаю, связана ли проблема с начальным сценарием 11.04 или с последним изменением, но для этого требуется новый ответ на 16.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
sleep 10
clear
sensors
done
exit 0
Чтобы упростить переключение пользователей как до, так и после системы, я написал скрипт, который будет использовать соответствующий метод приостановки на основе номера вашей версии ОС. По сути, он делает то же самое, что и обновленный сценарий 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. Вы просили, чтобы ответы основывались на надежных источниках. На самом деле Ask Ubuntu действительно имеет канонический пост о приостановке из командной строки: Как я могу приостановить / спящий режим из командной строки? В зависимости от подхода и уровня разрешений, которые вы хотите иметь в своем скрипте, есть несколько способов обшить там кошку. Некоторые работают лучше, чем другие. В своем ответе я представил подход dbus и systemctl, поскольку они также работают с блокировкой экрана. Если вы напишите в /sys/class/power/state
, он не заблокирует экран, хотя это можно обойти с помощью некоторой магии сценариев. Сейчас, я думаю, лучший подход - просто определить версию ОС и выбрать подходящий метод, как в моем сценарии, или использовать альтернативу pm-suspend
.
Я радикально отредактировал вышеупомянутый вопрос, чтобы запросить обновления для 16.04, и поэтому мой ответ ниже является лишь обновлением первоначального ответа Кенна , на котором я опубликовал дубликат вопрос и является также ответом по этому вопросу.
Поскольку ошибка в 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
Как указано в комментарии, сделанном wjandreea под дубликатом вопрос : 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
В моей системе каждый раз sensors
выполняется в потоковой передаче видео существует задержка. Наличие этого происходит каждые 10 секунд, или однако часто предлагаемый скрипт запущен, управлял бы мной сумасшедшая летучая мышь. Лучшее решение приостановить использовало бы thermald Intel и Powerclamp для замедления ЦП для уменьшения огня. Я записал, этот ответ для другого вопроса (Мешайте 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), в которой точке прочь выполняется жесткая сила, и данные могут быть повреждены.
Таким образом, вот мое рекомендуемое решение для предотвращения перегрева, и использование ЦП замедляются, а не прямая система приостанавливают.
Это работает на Ubuntu 16.04 + с Intel Sandy Bridge и более новыми процессорами.
От (wiki.debian.org-thermald) Debian (используемый Ubuntu), описывают о thermald, демоне Linux для охлаждения планшетов и ноутбуков. После того как системная температура достигает определенного порога, демон Linux активирует различные методы охлаждения для охлаждения системы.
Linux тепловой демон (thermald) контролирует и контролирует температуру в ноутбуках, планшеты ПК с последним Intel Sandy Bridge и последними выпусками Intel CPU. После того как системная температура достигает определенного порога, демон Linux активирует различные методы охлаждения, чтобы попытаться охладить систему.
Это работает в двух режимах:
apt-get install thermald
Драйвер Intel Powerclamp определяется здесь (kernel.org - Intel Power Clamp.txt) и является частью thermald, описанного выше. Прямая кавычка для Powerclamp из ссылки:
Рассмотрите ситуацию, где потребляемая мощность системы должна быть уменьшена во времени выполнения, из-за бюджета питания, теплового ограничения или уровня шума, и где активное охлаждение не предпочтено. Программное обеспечение справилось, пассивное снижение мощности должно быть выполнено для предотвращения аппаратных действий, которые разработаны для катастрофических сценариев.
В настоящее время P-состояния, T-состояния (модуляция часов), и ЦП offlining используются для регулировки ЦП.
На Intel CPUs C-состояния обеспечивают сокращение эффективной мощности, но до сих пор они только используются воспользовавшись ситуацией, на основе рабочей нагрузки. С разработкой intel_powerclamp драйвера был представлен метод синхронизации неактивной инжекции через все потоки ЦП онлайн. Цель состоит в том, чтобы достигнуть вызванной и управляемой резиденции C-состояния.
Тест/Анализ был сделан в областях питания, производительности, масштабируемости и пользовательского опыта. Во многих случаях ясное преимущество показывают по выведению из эксплуатации ЦП или модуляции тактовой частоты ЦП.
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.
Вот снимок экрана, когда Powerclamp вводит циклы сна:
Обычно в этой системе тактовая частота ЦП составляет от 2 400 МГц до 3 400 МГц, смотря, что видео HTML5 и 10 вкладок Chrome открываются. Обычно загрузка ЦП составляет приблизительно 9% к 12% через 8 центральных процессоров. Когда вещи становятся слишком горячими (86C), Powerclamp умирает, и это происходит:
x
от 0 до 7. Для первых 8 центральных процессоров.Выполнения драйвера Powerclamp до временных файлов отбрасывают ниже 85C снова. В то время как драйвер работает, у Вас могла бы быть доля секунды, приостанавливаясь в Ваших видео и возможно клавиатуре доли секунды и задержке мыши.
Назад в "прохладные былые времена" Ubuntu 14.04 Intel Turbo Boost был поврежден так, моя скорость процессора колебалась между 1 200 МГц и 2 400 МГц. После обновления Ubuntu 16.04 это подошло бы к 3 400 МГц (3,4 ГГц), потому что Турбо Повышение наконец работало. Но это также повысило тепло.
Отключить использование Intel Turbo Boost:
echo "1" | sudo tee /sys/devices/system/cpu/intel_pstate/no_turbo