[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Systemd Suspend Sedation Problem



Hi, I follow the following wiki page to setup a suspend sedation systemd service.
https://wiki.debian.org/SystemdSuspendSedation
Code:
# /etc/systemd/system/suspend-sedation.service
[Unit]
Description=Hibernate after suspend
Documentation=https://bbs.archlinux.org/viewtopic.php?pid=1420279#p1420279
Documentation=https://bbs.archlinux.org/viewtopic.php?pid=1574125#p1574125
Documentation=https://wiki.archlinux.org/index.php/Power_management
Documentation=https://wiki.debian.org/SystemdSuspendSedation
Conflicts=hibernate.target hybrid-suspend.target
Before=suspend.target
StopWhenUnneeded=true

[Service]
Type=oneshot
RemainAfterExit=yes
Environment="ALARM_SEC=300"
Environment="WAKEALARM=/sys/class/rtc/rtc0/wakealarm"

ExecStart=/usr/sbin/rtcwake --seconds $ALARM_SEC --auto --mode no
ExecStop=/bin/sh -c '\
ALARM=$(cat $WAKEALARM); \
NOW=$(date +%%s); \
if [ -z "$ALARM" ] || [ "$NOW" -ge "$ALARM" ]; then \
  echo "suspend-sedation: Woke up - no alarm set. Hibernating..."; \
  systemctl hibernate; \
else \
  echo "suspend-sedation: Woke up before alarm - normal wakeup."; \
  /usr/sbin/rtcwake --auto --mode disable; \
fi \
'

[Install]
WantedBy=sleep.target
RequiredBy=suspend.target

The goal is to allow my laptop first suspend when I close lid and if I dose not open lid for 5 min then it will hibernate.

This service works as expected when my AC adapter is connected. But when my laptop works on battery, its behavior is very strange.

1. Suppose I disconnect my AC adapter and closed the lid then my laptop will immediately suspend.
2. 5 minutes later, my laptop will beep means that it wakes up. The expecting behavior then is that it hibernates. But nothing happens.
3. If don't open the lid then the laptop keeps in suspend status.
4. If I open the lid then it will first wake up from suspend status and then go to hibernate at this time.

The following log of suspend-sedation.service explains the above behavior.
Code:
$ journalctl -u suspend-sedation
— Logs begin at Mon 2016-08-01 21:26:15 CST, end at Tue 2016-08-02 15:46:05 CST
// logs when work on AC
Aug 02 15:10:43 x301 systemd[1]: Starting Hibernate after suspend...
Aug 02 15:10:43 x301 rtcwake[16160]: rtcwake: wakeup using /dev/rtc0 at Tue Aug
Aug 02 15:10:43 x301 systemd[1]: Started Hibernate after suspend.
Aug 02 15:15:47 x301 sh[16240]: suspend-sedation: Woke up - no alarm set. Hibern
Aug 02 15:15:46 x301 systemd[1]: suspend-sedation.service: Unit not needed anymo
Aug 02 15:15:46 x301 systemd[1]: Stopping Hibernate after suspend...
Aug 02 15:15:47 x301 systemd[1]: Stopped Hibernate after suspend.
// logs when works on battary
Aug 02 15:18:49 x301 systemd[1]: Starting Hibernate after suspend...
Aug 02 15:18:49 x301 rtcwake[16628]: rtcwake: wakeup using /dev/rtc0 at Tue Aug
Aug 02 15:18:49 x301 systemd[1]: Started Hibernate after suspend.
Aug 02 15:27:13 x301 sh[16658]: suspend-sedation: Woke up - no alarm set. Hibern
Aug 02 15:27:10 x301 systemd[1]: suspend-sedation.service: Unit not needed anymo
Aug 02 15:27:10 x301 systemd[1]: Stopping Hibernate after suspend...
Aug 02 15:27:13 x301 systemd[1]: Stopped Hibernate after suspend.

The systemd version of my system is 230.

Dose anyone has a clue?

Cheers,
Qiang

Reply to: