web-dev-qa-db-ja.com

特定のCPU温度でスリープするBashスクリプト〜16.04の更新

これは、質問の根本的に更新されたバージョンです。 この質問 はこの質問の重複としてフラグが立てられているので、これを更新する必要がありますが、これには有効な回答がありません。


  • 11.04タグが付いたこの質問の最初のバージョン:

私はスクリプティングとLinuxが初めてで、コンプがときどき熱くなりすぎて、temp1を検出するスクリプトを作成したいと思います。65Cを超える場合は、スリープ状態にする必要があります。スクリプト内の値を比較するのが難しいのですが、数値を正しく定義できませんでした。誰か修正してください。これまでの私の刺し傷です

#!/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の新しい回答が必要です。

5
kenn

私は自分でスクリプトを作成することができました。

#!/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
kenn

前書き

Pre-systemdとpost-systemdの両方の切り替えユーザーを容易にするために、OSバージョン番号に基づいて適切な中断方法をとるスクリプトを作成しました。基本的に、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ユーティリティを見つけました。このプログラムは、OSのバージョンに関係なく機能します。小さな欠点は、rootアクセスが必要なことですが、その不便さは簡単に回避できます。

私が個人的に行うことは次のとおりです。

  1. Sudo apt-get install pm-utils
  2. Sudo visudoおよびファイルの最後にyourusername ALL = NOPASSWD: /usr/sbin/pm-suspendを追加します。
  3. スクリプトを編集して、dbusコマンドの代わりにSudo pm-suspendを呼び出します。

Ubuntuマシンの一般的な中断

回答には信頼できる情報源を使用するようにリクエストしました。実際、Ask Ubuntuにはコマンドラインからのサスペンドに関する標準的な投稿があります: コマンドラインからサスペンド/ハイバネートするにはどうすればよいですか? アプローチとレベルによって異なりますスクリプトに許可したい権限の場合、そこに猫のスキンを作成する方法は複数あります。あるものは他のものよりもうまく機能します。私の答えでは、dbusとsystemctlのアプローチを提供しました。これらはスクリーンロックでも動作するからです。 /sys/class/power/stateに書き込むと、画面はロックされませんが、スクリプトの魔法で回避することは可能です。現時点では、より良いアプローチは、OSバージョンを決定し、スクリプトのように適切な方法を選択するか、pm-suspend代替を使用することです。

3

私のシステムでは、sensorsを実行するたびに、ビデオストリーミングに途切れが生じます。これが10秒ごとに発生するか、提案されたスクリプトが頻繁に実行されると、夢中になります。中断するためのより良いソリューションは、Intelのthermaldおよびを使用することですPowerclampCPUの速度を低下させて、熱を低減します。別の質問( 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)

これは、一時停止/再開後に発生します。 [〜#〜] real [〜#〜]温度は+ 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)は、ラップトップ、タブレットPC、最新のIntel Sandy Bridgeおよび最新のIntel CPUリリースの温度を監視および制御します。システムの温度が特定のしきい値に達すると、Linuxデーモンはさまざまな冷却方法をアクティブにしてシステムの冷却を試みます。

次の2つのモードで動作します。

ゼロ構成モード

  • ほとんどのユーザーにとって、これはシステムのCPU温度を制御するのに十分なはずです。これはDTS=温度センサーを使用し、冷却方法としてIntel P状態ドライバー、パワークランプドライバー、Running Average Power Limit制御、およびcpufreqを使用します。

ユーザー定義の構成モード

  • これにより、サーマルXML構成ファイルでACPIスタイルの構成が可能になります。これを使用して、バグの多いACPI構成を修正したり、センサーや冷却装置を追加して微調整したりできます。これは、ユーザーモードで閉ループ熱制御を実装する最初のステップであり、コミュニティのフィードバックと提案に基づいて強化できます。

インストールする方法

apt-get install thermald

Intel Powerclamp

IntelのPowerclampドライバーはここで定義されています( kernel.org-Intel Power Clamp.txt )上記のthermaldの一部です。リンクからのPowerclampの直接引用:

電力バジェット、熱的制約、またはノイズレベルのために、実行時にシステムの電力消費を削減する必要があり、アクティブな冷却が好ましくない状況を考えます。壊滅的なシナリオ向けに設計されたハードウェアアクションを防止するために、ソフトウェア管理による受動的な電力削減を実行する必要があります。

現在、P状態、T状態(クロック変調)、およびCPUオフラインがCPUスロットリングに使用されています。

Intel CPUでは、Cステートは効果的な電力削減を提供しますが、これまでのところ、ワークロードに基づいて日和見的にしか使用されていません。 intel_powerclampドライバーの開発により、すべてのオンラインCPUスレッドでアイドル挿入を同期する方法が導入されました。目標は、強制および制御可能なC州の居住を達成することです。

テスト、分析は、パワー、パフォーマンス、スケーラビリティ、ユーザーエクスペリエンスの分野で行われています。多くの場合、CPUをオフラインにしたりCPUクロックを変調したりするよりも明らかな利点があります。


Powerclampが実行されていることをどのように確認しますか?

Powerclampは、ファンの通気口にほこりや糸くずが入りすぎる場合に1年に1回しか表示されないことがあります。では、実際にバックグラウンドで実行されていることをどのように確認しますか?使用する:

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動作していることを知っており、単に温度が85℃を超えるのを待っています。


Conkyが表示する動作中のパワークランプ

Powerclampがスリープサイクルを注入するときのスクリーンショットは次のとおりです。

Kidie Injection

通常、このシステムでは、HTML5ビデオと10 Chromeタブを開いたときのCPUクロック速度は2400 Mhz〜3400 Mhzです。通常、CPU使用率は8つのCPUで約9%〜12%です。 hot(86CPowerclampが起動し、これが起こります:

  • CPU速度は1200 Mhzに低下します。
  • CPU使用率が最大80%急上昇します。余分な70%は睡眠時間であるため、これは誤解を招きます。
  • 通常、上位9つのCPUプロセスは5または6 ChromeプロセスとXorg、Conky、Pulse Audio、および臨時のkworkerです。ただし、上位10のうち8つはkidle_inject/xprocess xは0〜7です。最初の8 CPUの場合。

Powerclampドライバーは、温度が再び85°Cを下回るまで実行されます。ドライバーの実行中に、ビデオの2番目の一時停止を分割したり、2番目のキーボードとマウスの遅延を分割したりする可能性があります。


Intel Turbo Boostを無効にする

Ubuntu 14.04の「クールな昔」に戻ると、Intel Turbo Boostが壊れていたため、プロセッサの速度は1200 Mhzから2400 Mhzの間で変動しました。 Ubuntu 16.04へのアップグレード後、Turbo Boostが最終的に機能したため、最大3400 Mhz(3.4 Ghz)になりました。しかし、それはまた熱を上げました。

Intel Turbo Boostの使用を無効にするには:

echo "1" | Sudo tee /sys/devices/system/cpu/intel_pstate/no_turbo
2

16.04の更新を求めるために上記の質問を根本的に編集しました。したがって、以下の回答は、私が投稿した のKenn による 最初の回答の更新です)重複した質問 であり、その下の 答え でもあります。

16.04のエラーはError org.freedesktop.DBus.Error.UnknownMethod: No such method 'Suspend'Nick Sillito私の重複した質問 の下に this 回答にリンクしたコメントの後、私はこの部分全体を置き換えることにより、スクリプトを変更しました。

    dbus-send --system --print-reply --dest="org.freedesktop.UPower" /org/freedesktop/UPower org.freedesktop.UPower.Suspend

    systemctl suspend

wjandreea による 重複した質問 のコメントに示されているように、sleep 10または同様の値は削除しないでください(最初に行ったように)。その行がないと、変更されたスクリプトは10秒ごとに実行するのではなく、可能な限り高速になります(1秒あたり数十回以上)ので、より多くの電力を使用します。

この時点で、システムはラインで設定されたレベルを超えるとスリープ状態になります

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
user47206