バッテリー残量が低いしきい値に達したときにラップトップをスリープ状態にするにはどうすればよいですか?


24

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

バッテリーが0%に達すると、コンピューターは突然シャットダウンし、警告も何も表示されません。

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

回答:


12

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によって1分ごとに実行するようにスケジュールできます。を使用してcrontabを編集しcrontab -e、スクリプトを追加します。

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

別の解決策は、GnomeやXfceなどのデスクトップ環境をインストールすることです(そして、ウィンドウマネージャーをi3に変更します)。上記の両方の停止環境は、コンピューターの電源を切る電源管理デーモンを備えています。しかし、意図的にそれらを使用せず、よりミニマルなソリューションを探していると思います。


うーん、私は走ってみましsleepd -b 40たが、40%マークの後に何も起こりませんでした。私も試しましたがsudo sleepd -b 40 -s pm-suspend、何も起こりません
...-o_o_o--

@NoamGagliardi確認済み、ここでも機能しません。さらに、パッケージはメンテナンスされていないようです。より良い代替案を見つけて回答を更新できる場合は、それ以外の場合は削除します。
マルコ

(TIL " cut"。)スクリプトは動作します!持っていacpi | cut -f2 -d, | cut -f1 d%ます-cronを読んで、それを単独で実行させます。ありがとう!
o_o_o--

/sys/devices/platform/smapi/ディレクトリがありません。バッテリー残量の残りの割合はどこで確認できますか?私は、カスタムカーネル3.10を使用しています
マーティンVegter

2
@MartinVegterハードウェアに依存しますので、試してみてください/sys/class/power_supply/BAT0/capacity。それ以外の場合は、acpiコマンドを使用します。
マルコ14年

6

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

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

PercentageAction=2
CriticalPowerAction=HybridSleep

TimeAction一緒に使用してUsePercentageForPolicy=false、指定された時間だけが残ったときにアクションを実行することもできます。

TimeAction=120

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

HybridSleepの利点は、スワップ領域にメモリを書き込むことに加えて、システムを一時停止することです。サスペンドはまだバッテリーを消費しますが、バッテリーが切れる前に戻ってきた場合、休止状態のシステムよりもサスペンドされたシステムからより迅速に再開できます。電源ソケットに戻る前にバッテリーがなくなった場合は、電源を入れ直すと休止状態からシステムを再開できます。


注:HybridSleepスワップスペースが必要だと思います。

2
@cipricusは正しいが、休止状態にできない場合、upowerはマシンをシャットダウンする代わりに正常にシャットダウンします。
ジョシュ

2

現在受け入れられている答えは素晴らしいですが、Ubuntu 16.04では少し時代遅れです。

  • バッテリーの状態を取得するコマンドが変更されました。
  • notify-sendが機能するために必要な環境変数が変更されました
  • hibernateにはrootが必要なので、そこに指定されたスクリプトはユーザーcronからは機能しなくなります。
  • 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の組み込みの起動アプリケーションを使用します)。

注: sudo systemctl hibernate cronでは機能しない場合があります。これに従って解決してください。


0

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

このシンプルなものは、デスクトップ環境なしで、小さくて高速な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_SUSPENDACPIイベントを送信します(ラップトップでサスペンドを要求するキーを押したように)、それは(で構成された/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です


それはとてもいいようです!しかし、それはcronの代わりにsystemdタイマーで使用できますか?(ここの例)cronが存在しないSolus OSを使用しています。

@cipricus私はそう思うが、systemdは避けるので、例を挙げることはできない。私はリコールにsystemdに思えるんので、あなたはおそらくそれとの衝突を回避したいと思うにsystemdとあなたがしているスタックした場合、独自のACPI電源ハンドラを持っている
マティヤNalis

おかげで、私が関与する代替を発見したunamegithub.com/jerrinfrncs/batterynotif/blob/master/...

0

私はこのソリューションが好きです、それは他の答えに部分的に触発されています:https : //github.com/jerrinfrncs/batterynotif、すなわちscript batterynotif(uname).sh

こちらのスクリプトをご覧くださいhttps : //github.com/jerrinfrncs/batterynotif/blob/master/batterynotif%28uname%29.sh

私自身の使用のために、コマンドを使用して、シャットダウンの代わりにハイブリッドスリープに入るようにスクリプトを変更しましたsystemctl hybrid-sleep。(このオプションではスワップ領域が必要です。)

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.