バッテリーが足りなくなったら休止状態に切り替えたいです。
SUBSYSTEM=="power_supply", \
ATTR{status}=="Discharging", \
ATTR{capacity}=="[0-5]", \
RUN+="/usr/bin/systemctl hibernate", \
この方法は、システムが起きている場合にうまく機能します。ところが止まっていると、目が覚めるまで眠れず、その後はすぐにロックを解除できず、代わりに眠りにつく。
一時停止中にこのイベントが機能するようにしたり、キャップを開かずにスリープモード解除(およびスリープモード)を実行するにはどうすればよいですか。
私は以下を追加してみました:
ATTR{power/wakeup}="enabled"
成功しませんでした。実際wakeup
、現在では何もありません/sys/class/power_supply/BAT1/power/
。事実は/sys/class/power_supply/BAT1/device/power/wakeup
存在し、今も存在していますenabled
。
一時停止中にudevルールを実行できないようです。バッテリーが足りなくなったときに個別に起動するようにトリガーする必要があります(udevルールが実行され、スリープ状態になる可能性があります)。
これが実装されていると思います。drivers/acpi/battery.c
:
/*
* Wakeup the system if battery is critical low
* or lower than the alarm level
*/
if ((battery->state & ACPI_BATTERY_STATE_CRITICAL) ||
(test_bit(ACPI_BATTERY_ALARM_PRESENT, &battery->flags) &&
(battery->capacity_now <= battery->alarm)))
acpi_pm_wakeup_event(&battery->device->dev);
しかし、それは私には効果がありません。 「しきい値が低い」が別のテキスト容量レベルであるかどうかはわかりません。低から「低」までしか表示されませんが、それ以下です/sys/class/power_supply/BAT1/alarm
。
注:わかりましたhybrid-sleep
。しかし、それは私が望むものではありません。まずは保存したいからです。一部suspend-then-hibernate
バッテリーが足りない場合は、休止状態で使用できます。または時間遅延。
答え1
これが実際にすぐに機能することがわかりました。 (バッテリーのサポートは異なる場合があります。)
/sys/class/power_supply/BATn/charge_now
以下の場合、ACPIドライバはスリープモードで起動します/sys/class/power_supply/BATn/alarm
。
私の元の質問のudevルールは実行(および休止状態)が可能です。
alarm
ただし、これは、値(%charge_full
)がudevルールで指定された範囲の上限と等しいか少し高いかどうかを確認したい場合があります。