Ubuntuを使用していますが、デスクトップ環境ではなくウィンドウマネージャーとしてi3を使用しています。
バッテリーが0%に達すると、コンピューターが突然シャットダウンし、警告などは表示されなくなります。
たとえば4%のバッテリーでスリープ状態になるように設定できる簡単なスクリプトまたは構成はありますか?
バッテリーレベルをチェックし、バッテリーレベルが特定のしきい値を下回った場合に、ここでpm-hibernate
というカスタムコマンドを呼び出す小さなスクリプトを次に示します。
#!/bin/sh
###########################################################################
#
# Usage: system-low-battery
#
# Checks if the battery level is low. If “low_threshold” is exceeded
# a system notification is displayed, if “critical_threshold” is exceeded
# a popup window is displayed as well. If “OK” is pressed, the system
# shuts down after “timeout” seconds. If “Cancel” is pressed the script
# does nothing.
#
# This script is supposed to be called from a cron job.
#
###########################################################################
# This is required because the script is invoked by cron. Dbus information
# is stored in a file by the following script when a user logs in. Connect
# it to your autostart mechanism of choice.
#
# #!/bin/sh
# touch $HOME/.dbus/Xdbus
# chmod 600 $HOME/.dbus/Xdbus
# env | grep DBUS_SESSION_BUS_ADDRESS > $HOME/.dbus/Xdbus
# echo 'export DBUS_SESSION_BUS_ADDRESS' >> $HOME/.dbus/Xdbus
# exit 0
#
if [ -r ~/.dbus/Xdbus ]; then
. ~/.dbus/Xdbus
fi
low_threshold=10
critical_threshold=4
timeout=59
shutdown_cmd='/usr/sbin/pm-hibernate'
level=$(cat /sys/devices/platform/smapi/BAT0/remaining_percent)
state=$(cat /sys/devices/platform/smapi/BAT0/state)
if [ x"$state" != x'discharging' ]; then
exit 0
fi
do_shutdown() {
sleep $timeout && kill $zenity_pid 2>/dev/null
if [ x"$state" != x'discharging' ]; then
exit 0
else
$shutdown_cmd
fi
}
if [ "$level" -gt $critical_threshold ] && [ "$level" -lt $low_threshold ]; then
notify-send "Battery level is low: $level%"
fi
if [ "$level" -lt $critical_threshold ]; then
notify-send -u critical -t 20000 "Battery level is low: $level%" \
'The system is going to shut down in 1 minute.'
DISPLAY=:0 zenity --question --ok-label 'OK' --cancel-label 'Cancel' \
--text "Battery level is low: $level%.\n\n The system is going to shut down in 1 minute." &
zenity_pid=$!
do_shutdown &
shutdown_pid=$!
trap 'kill $shutdown_pid' 1
if ! wait $zenity_pid; then
kill $shutdown_pid 2>/dev/null
fi
fi
exit 0
これは非常に単純なスクリプトですが、アイデアを理解して、ニーズに簡単に適合させることができると思います。バッテリレベルへのパスは、システムによって異なる場合があります。もう少しポータブルなのは、おそらくacpi | cut -f2 -d,
のようなものを使用してバッテリーレベルを取得することです。このスクリプトは、毎分実行するようにcronによってスケジュールできます。 crontabをcrontab -e
で編集し、スクリプトを追加します。
*/1 * * * * /home/me/usr/bin/low-battery-shutdown
別の解決策は、GnomeやXfceなどのデスクトップ環境をインストールすることです(そして、ウィンドウマネージャーをi3に変更します)。前述の両方の停止環境は、コンピューターの電源をオフにする電源管理デーモンを備えています。しかし、私はあなたが故意にそれらを使用しないで、よりミニマルなソリューションを求めていると思います。
独自のスクリプトをハッキングする代わりに、タグが示すようにUbuntuを使用している場合は、upowerパッケージをインストールするだけで済みます。 Ubuntuを含むすべてのDebian派生物で利用できるはずです。デフォルトでは/etc/UPower/UPower.conf
の設定が付属しており、バッテリーレベルが臨界値に達するとハイブリッドスリープがアクティブになります。クリティカルレベルのデフォルトは2%です。
他のディストリビューションのユーザーの場合、/etc/UPower/UPower.conf
の関連エントリは次のとおりです。
PercentageAction=2
CriticalPowerAction=HybridSleep
TimeAction
とUsePercentageForPolicy=false
を組み合わせて使用して、指定した時間が残ったときにアクションを実行することもできます。
TimeAction=120
CriticalPowerAction
の有効な値は、PowerOff
、Hibernate
およびHybridSleep
です。 HybridSleepが設定されているが使用できない場合、Hibernateが使用されます。 Hibernateが設定されているが利用できない場合、PowerOffが使用されます。
HybridSleepの利点は、スワップ領域にメモリを書き込むだけでなく、システムを一時停止することです。サスペンドはまだいくらかのバッテリーを消費しますが、バッテリーがなくなる前に戻った場合、休止状態のシステムよりもサスペンドされたシステムからはるかに迅速に再開できます。電源ソケットに戻る前にバッテリーが切れた場合、電源が再び入ると、システムを休止状態から再開できます。
現在受け入れられている答えは素晴らしいですが、Ubuntu 16.04では少し古くなっています:
systemctl hibernate
はpm-hibernate
よりも優先されます。したがって、 ここ は私が使用するスクリプトです。
#!/usr/bin/env bash
# Notifies the user if the battery is low.
# Executes some command (like hibernate) on critical battery.
# This script is supposed to be called from a cron job.
# If you change this script's name/path, don't forget to update it in crontab !!
level=$(cat /sys/class/power_supply/BAT1/capacity)
status=$(cat /sys/class/power_supply/BAT1/status)
# Exit if not discharging
if [ "${status}" != "Discharging" ]; then
exit 0
fi
# Source the environment variables required for notify-send to work.
. /home/anmol/.env_vars
low_notif_percentage=20
critical_notif_percentage=15
critical_action_percentage=10
if [ "${level}" -le ${critical_action_percentage} ]; then
# Sudo is required when running from cron
Sudo systemctl hibernate
exit 0
fi
if [ "${level}" -le ${critical_notif_percentage} ]; then
notify-send -i '/usr/share/icons/gnome/256x256/status/battery-caution.png' "Battery critical: ${level}%"
exit 0
fi
if [ "${level}" -le ${low_notif_percentage} ]; then
notify-send -i '/usr/share/icons/gnome/256x256/status/battery-low.png' "Battery low: $level%"
exit 0
fi
notify-send
が機能するために必要な環境変数は、 このスクリプト を使用して作成されます。
#!/usr/bin/env bash
# Create a new file containing the values of the environment variables
# required for cron scripts to work.
# This script is supposed to be scheduled to run at startup.
env_vars_path="$HOME/.env_vars"
rm -f "${env_vars_path}"
touch "${env_vars_path}"
chmod 600 "${env_vars_path}"
# Array of the environment variables.
env_vars=("DBUS_SESSION_BUS_ADDRESS" "XAUTHORITY" "DISPLAY")
for env_var in "${env_vars[@]}"
do
echo "$env_var"
env | grep "${env_var}" >> "${env_vars_path}";
echo "export ${env_var}" >> "${env_vars_path}";
done
このファイルは起動時に実行する必要があります(任意の方法を使用して実行できます。私はUbuntuの組み込み Startup Applications を使用しています)。
注:Sudo systemctl hibernate
はcronでは機能しない場合があります。それを解決するには this に従ってください。
以下を含むファイル/etc/cron.d/check-battery
を作成するだけです。
* * * * * root [ "$(cat /sys/class/power_supply/BAT0/status)" = Charging -o "$(cat /sys/class/power_supply/BAT0/capacity)" -gt 10 ] || systemctl suspend
これにより、バッテリーレベルが10%に達するとシステムが一時停止します。
もちろん、最後のsuspend
をhybrid-sleep
、hibernate
、poweroff
など、必要に応じて自由に置き換えてください。
acpi
パッケージでさえ、外部ツールは必要ありません。これはMatija Nalisの回答のアイデアに基づいていますが、2020年に調整されています。
私はこのソリューションが好きです。これは他の回答に部分的に影響を受けています: https://github.com/jerrinfrncs/batterynotif 、つまりスクリプトbatterynotif(uname).sh
。
ここのスクリプトを参照してください: https://github.com/jerrinfrncs/batterynotif/blob/master/batterynotif%28uname%29.sh
自分で使用するために、コマンドsystemctl hybrid-sleep
を使用して、シャットダウンではなくハイブリッドスリープに入るようにスクリプトを変更しました。 (このオプションにはスワップ領域が必要です。)
あなたがインストールしたものに応じて実装される多くの異なる電源管理スキームがあるので、それが実装されることができる多くの方法があります。
このシンプルなものは、デスクトップ環境がなく、小さくて高速なicewmウィンドウマネージャーがあるだけで、最小限のDebian Jessieで私に役立ちます。 (それ以外の場合は速度が遅すぎるため、削減されています。このように、はるかに優れたハードウェアでGNOMEよりもパフォーマンスが優れています。)
具体的には、次のパッケージをインストールしました:acpi acpi-fakekey acpi-support acpi-support-base acpid pm-utils次のどれもない(それらをパージした):gnome * kde * systemd * uswsusp upower laptop-mode-tools hibernate policykit-1
だから私はこれを/etc/cron.d/battery_low_check
に入れます(読みやすくするためにすべて1行に分割):
*/5 * * * * root acpi --battery |
awk -F, '/Discharging/ { if (int($2) < 10) print }' |
xargs -ri acpi_fakekey 205
これは迅速でリソース使用量が少なく、他のデーモンに依存しません(実際、それらがアクティブな場合は無視されます-詳細は/usr/share/acpi-support/policy-funcs
を参照してください)。
機能:5分ごと(*/5
-バッテリーを頻繁にチェックする必要がある場合は、*
を使用するだけで毎分に変更できます)バッテリーの状態( "acpi --battery")をポーリングし、バッテリーが「放電中」の場合にのみxargs -ri
の後にコマンドを実行します(つまり、ACに接続されていません)とバッテリーのステータスが10%
( "int($ 2)<10"未満-気軽にニーズに合わせて調整してください)
acpi_fakekey 205
は、デフォルトでKEY_SUSPEND
ACPIイベントを送信します(ラップトップでサスペンドを要求するキーを押したような)。これにより、通常の処理(/etc/default/acpi-support
で構成)が実行されます-私用ディスクにハイバネートします。
もちろん、acpi_fakekey 205
の代わりに他のコマンドを使用することもできます。たとえば、hibernate
(休止状態のパッケージから)、s2disk
またはs2mem
(uswsuspパッケージから)、pm-suspend-hybrid
などです。 (pm-utilsパッケージから)など.
ところで、上記のKEY_SUSPEND = 205のようなマジックキー番号は/usr/share/acpi-support/key-constants
で定義されています(他の興味深いものはおそらくKEY_SLEEP = 142)