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


44

J'ai un script qui est exécuté pour que la suspension / reprise fonctionne dans mon ordinateur portable. Puis - je une autre série de xinput, xkbsetet des xmodmapcommandes qui sont exécutées lorsque je lance une session pour avoir défilement à deux doigts et des raccourcis clavier mis en place. Lorsque je reprends la suspension, le défilement à deux doigts et les raccourcis clavier ne fonctionnent pas. J'ai besoin d'exécuter manuellement les commandes dans le deuxième fichier à nouveau. Comment puis-je les ajouter au script de suspension / reprise pour que cela soit fait automatiquement? Voir ci-dessous:

suspendre / reprendre le 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

Touches de défilement à deux doigts et script de raccourcis clavier

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"

Cela semble être une copie de askubuntu.com/questions/226278/run-script-on-wakeup/483714 . Voir aussi mon commentaire sur askubuntu.com/a/483714/170127 .
Jamadagni

Réponses:


41

Vous pouvez placer vos scripts dans le /etc/pm/sleep.drépertoire pour les exécuter après la suspension. Vous devrez ajouter une condition pour que votre script ne s'exécute que pendant la reprise, pas plus que pendant le processus de suspension. Par exemple, votre script de pavé tactile ressemblerait à ceci:

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é comme étant globalement exécutable et remplacez $ USER par le nom d'utilisateur correspondant.

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


2
On peut appeler ça comme tu veux. Il est judicieux de commencer par un nombre compris entre 00 et 49, conformément à la page de manuel pm-suspend: "00 - 49 Utilisateurs et à la plupart des hooks fournis par paquet. Si un hook suppose que tous les services habituels et l'infrastructure de l'espace utilisateur sont toujours en cours d'exécution, il devrait être ici. "
fader

3
Une autre réponse (maintenant supprimée) avait ceci: 's'il vous plaît notez le rapport de bogue suivant: launchpad.net/ubuntu/+source/pm-utils/+bug/1455097 après la mise à niveau vers des scripts vifs doivent être placés dans /lib/systemd/system-sleep/'
Wilf

8
Sur Ubuntu 15.10 , le script doit être à la /lib/systemd/system-sleep/place de /etc/pm/sleep.
Marc Belmont

7
Sur Ubuntu 16.04, les arguments donnés au script sont preavant d'entrer suspendre et postaprès reprendre au lieu de suspendetresume
Germar

3
J'ai essayé les deux derniers commentaires ici sur yakkety (16.10), et cela n'a pas fonctionné. Comment dépanner?
Gringo Suave

7

Sur Ubuntu 16.04, je devais créer un service de cette façon:

  1. créer un fichier

    sudo gedit /etc/systemd/system/somename.service
  2. mettre dedans

    [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. (facultatif) si ne fonctionne pas après la reprise de susp> contrôlez les erreurs avec

    journalctl -u somename.service

Cela semble également fonctionner sur Ubuntu 18.04, merci!
kelunik

Pourquoi Ubuntu laisse-t-il /etc/pm/sleep.d traîner s’il ne l’utilise pas? C'est déroutant et trompeur.
Jonathan Neufeld

Cela fonctionnait pour moi sur Ubuntu 18.04 (en fait, KDE Neon), mais je devais a): Sous [Service], mettez User = tim pour que le script s'exécute comme mon utilisateur b) dans mon script, exécutez DISPLAY =: 0.0; exportation AFFICHER
Tim Richardson

3

Ouvrez ce fichier:

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

Contenu:

#! / bin / sh

cas 1 $ en 
  poster)
    /usr/lib/pm-utils/power.d/95hdparm-apm resume
    ## Collez votre commande pour exécuter votre script
    ;; esac

Votre commande sera exécutée avec les privilèges d'administrateur .

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.