これは、質問の根本的に更新されたバージョンです。 この質問 はこの質問の重複としてフラグが立てられているので、これを更新する必要がありますが、これには有効な回答がありません。
私はスクリプティングと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の新しい回答が必要です。
私は自分でスクリプトを作成することができました。
#!/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
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アクセスが必要なことですが、その不便さは簡単に回避できます。
私が個人的に行うことは次のとおりです。
Sudo apt-get install pm-utils
Sudo visudo
およびファイルの最後にyourusername ALL = NOPASSWD: /usr/sbin/pm-suspend
を追加します。Sudo pm-suspend
を呼び出します。回答には信頼できる情報源を使用するようにリクエストしました。実際、Ask Ubuntuにはコマンドラインからのサスペンドに関する標準的な投稿があります: コマンドラインからサスペンド/ハイバネートするにはどうすればよいですか? アプローチとレベルによって異なりますスクリプトに許可したい権限の場合、そこに猫のスキンを作成する方法は複数あります。あるものは他のものよりもうまく機能します。私の答えでは、dbusとsystemctlのアプローチを提供しました。これらはスクリーンロックでも動作するからです。 /sys/class/power/state
に書き込むと、画面はロックされませんが、スクリプトの魔法で回避することは可能です。現時点では、より良いアプローチは、OSバージョンを決定し、スクリプトのように適切な方法を選択するか、pm-suspend
代替を使用することです。
私のシステムでは、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の使用率を低下させるための推奨されるソリューションは、完全なシステムサスペンドではなく、ここにあります。
これは、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つのモードで動作します。
apt-get install thermald
IntelのPowerclampドライバーはここで定義されています( kernel.org-Intel Power Clamp.txt )上記のthermaldの一部です。リンクからのPowerclampの直接引用:
電力バジェット、熱的制約、またはノイズレベルのために、実行時にシステムの電力消費を削減する必要があり、アクティブな冷却が好ましくない状況を考えます。壊滅的なシナリオ向けに設計されたハードウェアアクションを防止するために、ソフトウェア管理による受動的な電力削減を実行する必要があります。
現在、P状態、T状態(クロック変調)、およびCPUオフラインがCPUスロットリングに使用されています。
Intel CPUでは、Cステートは効果的な電力削減を提供しますが、これまでのところ、ワークロードに基づいて日和見的にしか使用されていません。 intel_powerclampドライバーの開発により、すべてのオンラインCPUスレッドでアイドル挿入を同期する方法が導入されました。目標は、強制および制御可能なC州の居住を達成することです。
テスト、分析は、パワー、パフォーマンス、スケーラビリティ、ユーザーエクスペリエンスの分野で行われています。多くの場合、CPUをオフラインにしたりCPUクロックを変調したりするよりも明らかな利点があります。
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℃を超えるのを待っています。
Powerclampがスリープサイクルを注入するときのスクリーンショットは次のとおりです。
通常、このシステムでは、HTML5ビデオと10 Chromeタブを開いたときのCPUクロック速度は2400 Mhz〜3400 Mhzです。通常、CPU使用率は8つのCPUで約9%〜12%です。 hot(86C)Powerclampが起動し、これが起こります:
x
は0〜7です。最初の8 CPUの場合。Powerclampドライバーは、温度が再び85°Cを下回るまで実行されます。ドライバーの実行中に、ビデオの2番目の一時停止を分割したり、2番目のキーボードとマウスの遅延を分割したりする可能性があります。
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
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