Interompre le script quand le rabat de l’écran est ouvert sur laptop

Tags: #<Tag:0x00007f99422f97d8> #<Tag:0x00007f99422f9648>

Bonjour o/

Sur un ordinateur portable, j’ai désactivé la mise en veille automatique lors du rabat de l’écran grâce aux commandes :

echo 'HandleLidSwitch=ignore' | tee --append /etc/systemd/logind.conf
echo 'HandleLidSwitchDocked=ignore' | tee --append /etc/systemd/logind.conf
sudo service systemd-logind restart

Et j’ai fais en sorte qu’un script de mon propre cru se déclenche à chaque rabattement de l’écran (si vous êtes curieux, le script en question se trouve ici dpaste/rLFD (Bash) mais il ne contient rien d’interessant pour la suite du problème).

Or, ce script contient une minuterie qui fait qu’au bout de 15 min d’inactivité, la commande shutdown 0 se lance.

Problème : le script continue à s’exécuter — même quand l’ordinateur est réactivé —.
Or, je voudrais faire en sorte que la totalité du script soit interrompue dès lors que l’ordinateur est de nouveau actif. Comment dire ça à ACPI ?

Merci par anticipation :slight_smile:

Bonjour

Dans le script suivant, qui est une copie du tiens,
j’ai ajouté une fonction nommée ​myScrOpened dans le script
qui sera lancée juste après la fin d’exécution de chaque ligne de commande sleep
et qui fera se terminer l’exécution du script si l’écran est « ouvert »

#!/bin/bash
#
# Lid closing event script
​
# main user
USER=fauve

# my exit function
myScrOpened() {
    if [[ $(</proc/acpi/button/lid/LID/state) =~ open ]]; then
        echo "Screen opened."
        exit 125    # Exit status 125 <=> Operation canceled
    fi
}

# Remaining percent of battery
REMAININGBAT=$(</sys/class/power_supply/BAT0/capacity)
​
# Test battery remaining percentage
if [ $REMAININGBAT -gt 10 ]; then
    # If the percentage is higher than 10
    TIMEBEFORELOCK="1m"
    TIMEBEFORESUSPENSION="9m"
    TIMEBEFORESHUTDOWN="5 minutes"
else
    # If the percentage is less than 10
    TIMEBEFORELOCK="1m"
    TIMEBEFORESUSPENSION="2m"
    TIMEBEFORESHUTDOWN="4 minutes"
fi
​
TIMEBEFORELOCK="1m"
TIMEBEFORESUSPENSION="1m"
TIMEBEFORESHUTDOWN="1 minutes"
​
# Do noting a ${TIMEBEFORELOCK} time
# In case if a quick shifting from a room to another
echo "$(date): Waiting ${TIMEBEFORELOCK} before lock"
sleep ${TIMEBEFORELOCK}
​myScrOpened

# set screensaver for ${TIMEBEFORESUSPENSION} time
echo "$(date): Lock now"
su -c  "DISPLAY=:0.0 /home/$USER/.local/bin/screenlock" - $USER &
echo "$(date): Waiting ${TIMEBEFORESUSPENSION} before suspension"
sleep ${TIMEBEFORESUSPENSION}
​myScrOpened

# Set a wake up at given time
echo "$(date): Seting time before waking up to ${TIMEBEFORESHUTDOWN}"
echo `date '+%s' -d "+ ${TIMEBEFORESHUTDOWN}"` > /sys/class/rtc/rtc0/wakealarm
​
# Suspend for ${TIMEBEFORESHUTDOWN} time
echo "$(date): Starting suspension for ${TIMEBEFORESHUTDOWN}"
systemctl suspend
echo "$(date): Wake up"
​
# Wait 5s to ensure the next command will take effect
sleep 5s
​myScrOpened

# shutdown
echo "$(date): Shutdown"
shutdown +0

EDIT : Je n’ai pas très bien compris l’intérêt de programmer une heure de réveil dans ton script,
peut-être qu’il s’agissait d’essais, alors j’ai laissé tel quel …

1 J'aime

Merci beaucoup, ta solution est interessante. Mon script a un peut évolué entre temps (je vais le mettre à jour dans la journée).

En fait, l’heure de réveil est très importante. Car en fait, le shutdown doit arriver après la veille. Or, tant que l’ordinateur est en veille, le shutdown (ni aucune autre commande d’ailleurs) ne peut pas s’éxecuter. Il faut d’abbord révieller l’ordinateur, et dès le réveil la commande shutdwons’éxecute pour qu’il puisse effectivement s’éteindre. Voilà l’interet de la programmation du réveil.