Скрипт Bash для сна при заданной температуре процессора ~ обновление для 16.04

Это радикально обновленная версия вопроса. Я должен обновить это, потому что этот вопрос помечен как дубликат этого, в то время как на этот вопрос больше нет действительного ответа.


  • Начальная версия этого вопроса с тегом 11.04:

Я новичок в сценариях и 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.

5
задан 13 April 2017 в 15:24

4 ответа

Мне удалось сделать свой собственный сценарий.

#!/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
0
ответ дан 13 April 2017 в 15:24

Введение

Чтобы упростить переключение пользователей как до, так и после системы, я написал скрипт, который будет использовать соответствующий метод приостановки на основе номера вашей версии ОС. По сути, он делает то же самое, что и обновленный сценарий 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-доступа, но от этого неудобства легко обойтись.

Что я лично сделал бы, это следующее:

  1. sudo apt-get install pm-utils
  2. sudo visudo и добавить yourusername ALL = NOPASSWD: /usr/sbin/pm-suspend в конце файла.
  3. отредактируйте ваш скрипт для вызова sudo pm-suspend вместо команды dbus.

Приостановка работы машины с Ubuntu в целом

Вы просили, чтобы ответы основывались на надежных источниках. На самом деле Ask Ubuntu действительно имеет канонический пост о приостановке из командной строки: Как я могу приостановить / спящий режим из командной строки? В зависимости от подхода и уровня разрешений, которые вы хотите иметь в своем скрипте, есть несколько способов обшить там кошку. Некоторые работают лучше, чем другие. В своем ответе я представил подход dbus и systemctl, поскольку они также работают с блокировкой экрана. Если вы напишите в /sys/class/power/state, он не заблокирует экран, хотя это можно обойти с помощью некоторой магии сценариев. Сейчас, я думаю, лучший подход - просто определить версию ОС и выбрать подходящий метод, как в моем сценарии, или использовать альтернативу pm-suspend.

0
ответ дан 13 April 2017 в 15:24

Я радикально отредактировал вышеупомянутый вопрос, чтобы запросить обновления для 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
0
ответ дан 13 April 2017 в 15:24

В моей системе каждый раз 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 активирует различные методы охлаждения, чтобы попытаться охладить систему.

Это работает в двух режимах:

Нулевой режим конфигурации

  • Для большинства пользователей этого должно быть достаточно для подчинения контролю температуры ЦП системы. Это использует температурный датчик DTS и использует драйвер состояния Intel P, драйвер зажима Питания, Выполняя Предельное управление Средней мощностью и cpufreq как охлаждающиеся методы.

Определяемый пользователем режим конфигурации

  • Это позволяет конфигурацию стиля ACPI в тепловом конфигурационном XML-файле. Это может использоваться для фиксации ошибочной конфигурации ACPI или точной настройки путем добавления большего количества датчиков и устройств охлаждения. Это - первый шаг в реализации близкого цикла тепловое управление в непривилегированном режиме и может быть улучшено на основе общественной обратной связи и предложений.

Как установить

apt-get install thermald

Intel Powerclamp

Драйвер Intel Powerclamp определяется здесь (kernel.org - Intel Power Clamp.txt) и является частью thermald, описанного выше. Прямая кавычка для Powerclamp из ссылки:

Рассмотрите ситуацию, где потребляемая мощность системы должна быть уменьшена во времени выполнения, из-за бюджета питания, теплового ограничения или уровня шума, и где активное охлаждение не предпочтено. Программное обеспечение справилось, пассивное снижение мощности должно быть выполнено для предотвращения аппаратных действий, которые разработаны для катастрофических сценариев.

В настоящее время P-состояния, T-состояния (модуляция часов), и ЦП offlining используются для регулировки ЦП.

На Intel CPUs C-состояния обеспечивают сокращение эффективной мощности, но до сих пор они только используются воспользовавшись ситуацией, на основе рабочей нагрузки. С разработкой intel_powerclamp драйвера был представлен метод синхронизации неактивной инжекции через все потоки ЦП онлайн. Цель состоит в том, чтобы достигнуть вызванной и управляемой резиденции C-состояния.

Тест/Анализ был сделан в областях питания, производительности, масштабируемости и пользовательского опыта. Во многих случаях ясное преимущество показывают по выведению из эксплуатации ЦП или модуляции тактовой частоты ЦП.


Как Вы знаете, что Powerclamp работает?

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 в действии, отображенном Носатым

Вот снимок экрана, когда Powerclamp вводит циклы сна:

Kidie Injection

Обычно в этой системе тактовая частота ЦП составляет от 2 400 МГц до 3 400 МГц, смотря, что видео HTML5 и 10 вкладок Chrome открываются. Обычно загрузка ЦП составляет приблизительно 9% к 12% через 8 центральных процессоров. Когда вещи становятся слишком горячими (86C), Powerclamp умирает, и это происходит:

  • Скорость ЦП уменьшается до 1 200 МГц.
  • Загрузка ЦП пронзает до 80%. Это вводит в заблуждение, потому что дополнительные 70% спят время.
  • Лучшие 9 процессов ЦП обычно являются 5 или 6 процессами Chrome плюс Xorg, Носатое, Импульсное Аудио и случайный kworker. Однако теперь 8 из лучших 10 являются процессом kidle_inject/x где x от 0 до 7. Для первых 8 центральных процессоров.

Выполнения драйвера Powerclamp до временных файлов отбрасывают ниже 85C снова. В то время как драйвер работает, у Вас могла бы быть доля секунды, приостанавливаясь в Ваших видео и возможно клавиатуре доли секунды и задержке мыши.


Отключите Intel Turbo Boost

Назад в "прохладные былые времена" 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
2
ответ дан 13 April 2017 в 15:24

Другие вопросы по тегам:

Похожие вопросы: