バッテリー残量が少ないしきい値に達したときにノートパソコンをスリープ状態にするにはどうすればよいでしょうか?

バッテリー残量が少ないしきい値に達したときにノートパソコンをスリープ状態にするにはどうすればよいでしょうか?

私は Ubuntu を使用していますが、デスクトップ環境ではなく、ウィンドウ マネージャーとして i3 を使用しています。

バッテリーが 0% になると、警告も何もなく、コンピューターが突然シャットダウンします。

たとえば、バッテリー残量が 4% になるとスリープ状態になるように設定できる簡単なスクリプトまたは構成はありますか?

答え1

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
  source ~/.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 で 1 分ごとに実行されるようにスケジュールできます。crontab を編集してcrontab -e、次のスクリプトを追加します。

*/1 * * * * /home/me/usr/bin/low-battery-shutdown

もう 1 つの解決策は、Gnome や Xfce などのデスクトップ環境をインストールすることです (そしてウィンドウ マネージャーを i3 に変更します)。前述の両方のデスクトップ環境には、コンピューターの電源をオフにする電源管理デーモンが備わっています。しかし、意図的にそれらを使用せず、より最小限の解決策を探しているのだと思います。

答え2

独自のスクリプトをハッキングする代わりに、タグが示唆するように Ubuntu を使用している場合は、upower パッケージをインストールするだけで済みます。これは、Ubuntu を含むすべての Debian 派生製品で利用できるはずです。デフォルトでは、/etc/UPower/UPower.confバッテリー レベルが臨界値に達するとハイブリッド スリープをアクティブにする構成になっています。臨界レベルのデフォルトは 2% です。

他のディストリビューションのユーザーの場合、関連するエントリは次のとおり/etc/UPower/UPower.confです。

PercentageAction=2
CriticalPowerAction=HybridSleep

TimeActionを一緒に使用しUsePercentageForPolicy=falseて、指定した時間が経過したらアクションを実行することもできます。

TimeAction=120

の有効な値は、、CriticalPowerActionおよびです。HybridSleep が設定されているが利用できない場合は、Hibernate が使用されます。Hibernate が設定されているが利用できない場合は、PowerOff が使用されます。PowerOffHibernateHybridSleep

HybridSleep の利点は、メモリをスワップ領域に書き出すだけでなく、システムをサスペンドすることです。サスペンドではバッテリーが消費されますが、バッテリーが切れる前に復帰すれば、休止状態から復帰するよりもサスペンド状態から復帰する方がはるかに早くなります。電源ソケットに戻る前にバッテリーが切れてしまった場合は、電源が再び入ると、システムを休止状態から復帰できます。

答え3

Debian ≥ 10 (および比較的最近の Linux システム) では、次/etc/cron.d/check-batteryの内容を含むファイルを作成するだけです。

* * * * * root [ "$(cat /sys/class/power_supply/BAT0/status)" != Discharging -o "$(cat /sys/class/power_supply/BAT0/capacity)" -gt 30 ] || systemctl suspend

これにより、バッテリー レベルが 30% に達するとシステムが一時停止します。

もちろん、末尾suspendhybrid-sleephibernatepoweroffまたは必要に応じて任意のものに置き換えてもかまいません。

外部ツールは不要で、acpiパッケージも必要ありません。これは、Matija Nalis の回答のアイデアに基づいていますが、2023 年に調整されています。

答え4

インストールされているものに応じてさまざまな電源管理スキームが実装されているため、実装方法も多数あります。

このシンプルなものは、デスクトップ環境のない、小さくて高速な 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- より頻繁にバッテリーをチェックする必要がある場合は、 を使用するだけで1分ごとに変更できます*)バッテリーの状態をポーリングします("acpi --バッテリー") を実行し、xargs -riバッテリーが "放電中" (つまり、AC に接続されていない) かつバッテリーの状態が10%("整数 ($2) < 10「 - 必要に応じて自由に調整してください)

acpi_fakekey 205デフォルトでは、KEY_SUSPENDACPI イベント (ラップトップでキーを押してサスペンドを要求した場合など) が送信され、その後、通常実行される処理 ( で設定/etc/default/acpi-support) が実行されます。私の場合は、ディスクに休止状態になります。

もちろん、代わりに他のコマンドを使用することもできますacpi_fakekey 205: hibernate(hibernate パッケージから)、s2disk( s2memuswsusp パッケージから)、pm-suspend-hybrid(pm-utils パッケージから) など。

ちなみに、魔法の鍵となる数字はKEY_SUSPEND=205上記の定義は/usr/share/acpi-support/key-constants(他の興味深い定義はおそらくキー_スリープ=142

関連情報