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

У меня была эта проблема, когда я пытался запустить и запустить свою собственную виртуальную машину. Я загрузил VDI-файл с OSBox и пытался использовать его для создания виртуальной машины.

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

See the circled part

5
задан 13.04.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
9
ответ дан 17.10.2019, 11:47
  • 1
    Этот doesn' t работают над более новыми версиями Ubuntu. Нет никакого /etc/acpi/sleep.sh на Ubuntu 14.04. – Engineero 13.06.2015, 15:15
  • 2
    @kasperd пытаются заменить sudo /etc/acpi/sleep.sh force dbus-send --system --print-reply --dest="org.freedesktop.UPower" /org/freedesktop/UPower org.freedesktop.UPower.Suspend – Jeff Bauer 13.06.2015, 16:36
  • 3
    Оказывается этим isn' t, что я искал так или иначе. Я искал способ поместить всего одно ядро процессора для сна, не вся система. –  13.06.2015, 18:03
  • 4
    @kasperd можно понизить частоту тактовой частоты ЦП, чтобы помешать ЦП перегреваться. github.com/Sepero/temp-throttle – Oli 13.06.2015, 18:45
  • 5
    That' s полезный для знания о. Увы, даже с обоими ядрами, которые отрегулировали к самой низкой доступной скорости I can' t препятствуют тому, чтобы эта машина включила вентилятор. – dbr 13.06.2015, 19:03

Введение

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

3
ответ дан 17.10.2019, 11:47
  • 1
    На основном сценарии : какова переменная часть, которая имеет к определенному число версии ОС и может дать пример о том, как получить ту форму? - На pm-suspend : Я don' t понимают, что сделать с ним, выполнив, который приостанавливает систему. Я должен поместить это в Ваш сценарий? Где точно? - Извините, что настоял, но мой уровень навыков заставляет меня спросить готовый к хождению сценарий. – carefulweb 26.01.2017, 15:46
  • 2
    @cipricus версия определяется путем чтения /etc/os-release файл. Вы don' t должны сделать что-либо. Все задание сделано в сценарии этой командой: os_version=$(awk -F'["=]' '/VERSION_ID/{print substr($3,1,2)}' /etc/os-release). Основной сценарий уже готов к хождению. Что касается pm-suspend, просто сделайте 3 шага в моем ответе, и вместо dbus команда в сценарии, используйте pm-suspend. Если Вы хотите, я могу отправить это в ответ также – dbr 26.01.2017, 21:41

Я радикально отредактировал вышеупомянутый вопрос, чтобы запросить обновления для 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
ответ дан 17.10.2019, 11:47

В моей системе каждый раз, когда запускается sensors, возникает задержка в потоковой передаче видео. То, что это происходит каждые 10 секунд или как часто запускается сценарий, сводит меня с ума. Лучшим решением для приостановки было бы использование Intel thermald и Powerclamp для замедления ЦП с целью уменьшения нагрева. Я написал этот ответ для другого вопроса ( Остановите процессор от перегрева ) и копирую здесь для удобства.

Кроме того, приведенный выше скрипт опирается на 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)

Это происходит после приостановки / возобновления. Температура REAL составляет + 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 thermal daemon (thermald) отслеживает и контролирует температуру в ноутбуках, планшетах ПК с последними версиями Intel Sandy Bridge и новейшими версиями процессоров Intel. Как только температура системы достигает определенного порога, демон Linux активирует различные методы охлаждения, чтобы попытаться охладить систему.

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

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

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

Пользовательский режим конфигурации

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

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

apt-get install thermald

Intel Powerclamp

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

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

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

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

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


Откуда вы знаете, что 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. [1 158]


Powerclamp в действии, отображаемый Conky

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

Kidie Injection

Обычно в этой системе тактовая частота процессора составляет от 2400 МГц до 3400 МГц при просмотре видео HTML5 и 10 открытых вкладок Chrome. Обычно загрузка процессора составляет около 9-12% на 8 процессорах. Когда становится слишком жарко ( 86C ) Включается Powerclamp , и это происходит:

  • Скорость процессора снижается до 1200 МГц.
  • Загрузка процессора увеличивается до 80%. Это вводит в заблуждение, потому что дополнительные 70% - это время сна.
  • В топ-9 процессов ЦП входят, как правило, 5 или 6 процессов Chrome, а также Xorg, Conky, Pulse Audio и случайный kworker. Однако теперь 8 из топ-10 - это процесс kidle_inject / x , где x - от 0 до 7. Для первых 8 процессоров.

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


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

Еще в «крутые старые времена» Ubuntu 14.04 Intel Turbo Boost был сломан, поэтому частота моего процессора колебалась от 1200 МГц до 2400 МГц. После обновления до Ubuntu 16.04 он увеличился до 3400 МГц (3,4 ГГц), потому что Turbo Boost наконец заработал. Но это также подняло жару.

Чтобы отключить Intel Turbo Boost, используйте:

echo "1" | sudo tee /sys/devices/system/cpu/intel_pstate/no_turbo
2
ответ дан 17.10.2019, 11:47
  • 1
    и включить назад турбо повышение? – Mike DeSimone 27.01.2017, 15:37
  • 2
    также: echo "1" | sudo tee /sys/devices/system/cpu/intel_pstate/no_turbo 1 дает: tee: /sys/devices/system/cpu/intel_pstate/no_turbo: Operation not permitted – renzop 27.01.2017, 15:49
  • 3
    Странный это работает над моей Ivy Bridge. I' ll тестируют его снова после работы и обновляют Вас, если код изменяется. Включить турбо эхо " 0" или перезагрузка. – qarthandso 27.01.2017, 17:51
  • 4
    Don' t беспокойство, это было намного более просто в этом случае: askubuntu.com/a/876998/47206 – Antoine Pinsard 28.01.2017, 17:17

Теги

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