“systemctl hibernate” retornando 1 quando executado a partir do script systemd

“systemctl hibernate” retornando 1 quando executado a partir do script systemd

Então, eu tenho um pequeno script systemd que deve hibernar meu laptop depois que ele estiver no modo de suspensão após x segundos (o nome do arquivo é /lib/systemd/system-sleep/0000rtchibernate.sh):


#!/bin/bash
# Script name: /usr/lib/systemd/system-sleep/0000rtchibernate.sh
# Purpose: Auto hibernates after a period of sleep
# Edit the "autohibernate" variable below to set the number of seconds to sleep.
curtime=$(date +%s)
autohibernate=10  #for testing purposes
sleeptime=2
logging=true
logfile="/lib/systemd/system-sleep/0000rtchibernate.log"
skipfile="/lib/systemd/system-sleep/0000rtchibernate.skip"
lockfile="/tmp/rtchibernate.lock"
echo "$curtime $1" >>/tmp/autohibernate.log

if [ "$2" = "hibernate" ]; then
        if [ "$logging" = true ]; then
            echo "$(date) : Hibernating, doing nothing" >> $logfile
        fi

    exit 0
fi

if [ "$1" = "pre" ]; then
    # only set timer if file 0000rtchibernate.skip doesn't exist
    if [ ! -f $skipfile ]; then
        # Suspending.  Record current time, and set a wake up timer.
        if [ "$logging" = true ]; then
            echo "$(date) : Suspending" >> $logfile
        fi
        echo "$curtime" > $lockfile
        rtcwake -m no -s $autohibernate
    fi
fi

if [ "$1" = "post" ]; then
    if [ -f $skipfile ]; then
        # if skipfile is present on resume, remove it
        if [ "$logging" = true ]; then
            echo "$(date) : Removing skipfile" >> $logfile
        fi
        rm $skipfile
    else
        # Coming out of sleep
        sustime=$(cat $lockfile)
        rm $lockfile

        # Did we wake up due to the rtc timer above?
        if [ $(($curtime - $sustime)) -ge $((autohibernate-5)) ]; then

            if [ "$logging" = true ]; then
                echo "$(date) : Hibernating" >> $logfile
            fi

            # Then hibernate
            /bin/systemctl hibernate
            return_val=$?
            if [ "$logging" = true ]; then
                echo "$(date) : Return value of systemctl hibernate was $return_val" >> $logfile
            fi
            # if hibernation fails, create skipfile and suspend
            if [ "$return_val" -gt 0 ]; then
                if [ "$logging" = true ]; then
                    echo "$(date) : Hibernation failed. Creating skipfile and suspending" >> $logfile
                fi
                touch $skipfile
                /bin/systemctl suspend
            fi

        else
            if [ "$logging" = true ]; then
                echo "$(date) : Waking up early, not hibernating" >> $logfile
            fi
            # Otherwise cancel the rtc timer and wake up normally.
            rtcwake -m no -s 1
        fi
    fi
fi

(o código é originalmente deaqui, eu apenas adaptei para o systemd)

Os scripts funcionam bem ao suspender o laptop. Aqui está a saída do log:


Di 20. Mär 10:53:31 CET 2018 : Suspending
Di 20. Mär 10:53:44 CET 2018 : Hibernating
Di 20. Mär 10:53:44 CET 2018 : Return value of systemctl hibernate was 1
Di 20. Mär 10:53:44 CET 2018 : Hibernation failed. Creating skipfile and suspending

Meu problema é que ambos /bin/systemctl hibernatetêm /bin/systemctl suspendum valor de retorno 1 e não fazem o que deveriam, embora tudo esteja bem ao executar a partir de uma janela de terminal. A propósito, estou no Ubuntu 18.04. Qualquer ajuda será apreciada :-)

informação relacionada