59 votes

comment exécuter une commande après la reprise de la suspension ?

J'ai un script qui est exécuté pour que la suspension/reprise fonctionne dans mon ordinateur portable. Ensuite, j'ai une autre série de xinput , xkbset y xmodmap qui sont exécutées lorsque je lance une session afin de configurer le défilement à deux doigts et les raccourcis clavier. Lorsque je reprends la session après une suspension, le défilement à deux doigts et mes raccourcis clavier ne fonctionnent pas. Je dois à nouveau exécuter manuellement les commandes du deuxième fichier. Comment puis-je les ajouter au script de suspension/reprise pour que cela se fasse automatiquement ? Voir ci-dessous :

suspendre/reprendre script

/etc/pm/sleep.d/20_custom-ehci_hcd

#!/bin/sh
#inspired by http://art.ubuntuforums.org/showpost.php?p=9744970&postcount=19
#...and http://thecodecentral.com/2011/01/18/fix-ubuntu-10-10-suspendhibernate-not-working-bug    
# tidied by tqzzaa :)

VERSION=1.1
DEV_LIST=/tmp/usb-dev-list
DRIVERS_DIR=/sys/bus/pci/drivers
DRIVERS="ehci xhci" # ehci_hcd, xhci_hcd
HEX="[[:xdigit:]]"
MAX_BIND_ATTEMPTS=2
BIND_WAIT=0.1

unbindDev() {
  echo -n > $DEV_LIST 2>/dev/null
  for driver in $DRIVERS; do
    DDIR=$DRIVERS_DIR/${driver}_hcd
    for dev in `ls $DDIR 2>/dev/null | egrep "^$HEX+:$HEX+:$HEX"`; do
      echo -n "$dev" > $DDIR/unbind
      echo "$driver $dev" >> $DEV_LIST
    done
  done
}

bindDev() {
  if [ -s $DEV_LIST ]; then
    while read driver dev; do
      DDIR=$DRIVERS_DIR/${driver}_hcd
      while [ $((MAX_BIND_ATTEMPTS)) -gt 0 ]; do
          echo -n "$dev" > $DDIR/bind
          if [ ! -L "$DDIR/$dev" ]; then
            sleep $BIND_WAIT
          else
            break
          fi
          MAX_BIND_ATTEMPTS=$((MAX_BIND_ATTEMPTS-1))
      done  
    done < $DEV_LIST
  fi
  rm $DEV_LIST 2>/dev/null
}

case "$1" in
  hibernate|suspend) unbindDev;;
  resume|thaw)       bindDev;;
esac

défilement à deux doigts sur le pavé tactile et raccourcis clavier script.

xinput set-int-prop "SynPS/2 Synaptics TouchPad" "Two-Finger Scrolling" 8 1
xinput set-int-prop "SynPS/2 Synaptics TouchPad" "Synaptics Two-Finger Scrolling" 8 1 1
xinput set-int-prop "SynPS/2 Synaptics TouchPad" "Synaptics Two-Finger Pressure" 32 10
xinput set-int-prop "SynPS/2 Synaptics TouchPad" "Synaptics Two-Finger Width" 32 8
setxkbmap -layout gb
xkbset m
xkbset exp =m
xmodmap -e "keycode 135 = Pointer_Button2"

47voto

Edo Points 861

Vous pouvez placer vos scripts dans la section /etc/pm/sleep.d pour les faire fonctionner après la suspension. Vous devrez ajouter une condition pour que votre script s'exécute uniquement pendant la reprise et non pendant le processus de suspension également. Par exemple, votre script pour le pavé tactile ressemblerait à :

case "${1}" in
    resume|thaw)
        DISPLAY=:0.0 ; export DISPLAY
        xinput set-int-prop "SynPS/2 Synaptics TouchPad" "Two-Finger Scrolling" 8 1
        xinput set-int-prop "SynPS/2 Synaptics TouchPad" "Synaptics Two-Finger Scrolling" 8 1 1
        xinput set-int-prop "SynPS/2 Synaptics TouchPad" "Synaptics Two-Finger Pressure" 32 10
        xinput set-int-prop "SynPS/2 Synaptics TouchPad" "Synaptics Two-Finger Width" 32 8
        setxkbmap -layout gb
        xkbset m
        xkbset exp =m
        su $USER -c "sleep 3; /usr/bin/xmodmap -e "keycode 135 = Pointer_Button2"" &
;;
esac

Assurez-vous que votre script est marqué globalement exécutable et changez $USER pour le nom d'utilisateur correspondant.

Vous pouvez trouver des informations plus détaillées dans la page de manuel pm-suspend ( man pm-suspend ) ou en consultant la documentation dans /usr/share/doc/pm-utils (notamment /usr/share/doc/pm-utils/HOWTO.hooks.gz ).

10voto

janot Points 1461

Sur Ubuntu 16.04, j'ai dû créer un service de cette façon :

  1. créer un fichier

    sudo gedit /etc/systemd/system/somename.service
  2. mettre à l'intérieur

    [Unit]
    Description=Some description
    Before=sleep.target
    StopWhenUnneeded=yes
    
    [Service]
    Type=oneshot
    RemainAfterExit=yes
    ExecStop=-/path/to/your/script.sh
    
    [Install]
    WantedBy=sleep.target
  3. activer le service

    sudo systemctl enable somename
  4. (optionnel) si cela ne fonctionne pas après la reprise de la suspension > vérifier les erreurs avec

    journalctl -u somename.service

10voto

Abhishek Singh Points 111

Ouvrez ce fichier :

sudo vim /lib/systemd/system-sleep/hdparm

Contenu :

#!/bin/sh

case $1 in 
  post)
    /usr/lib/pm-utils/power.d/95hdparm-apm resume
    ## Paste your command to run your script
    ;; esac

Votre commande s'exécutera avec privilèges admin .

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X