come eseguire un comando dopo aver ripreso dalla sospensione?


44

Ho uno script che viene eseguito per sospendere / riprendere a lavorare sul mio laptop. Poi ho un altro serie di xinput, xkbsete xmodmapcomandi che vengono eseguiti quando iniziare una sessione di avere lo scorrimento a due dita e tasti di scelta rapida impostati. Quando riprendo dalla sospensione, lo scorrimento con due dita e le scorciatoie da tastiera non funzionano. Devo eseguire di nuovo manualmente i comandi nel secondo file. Come posso aggiungerli allo script suspend / resume per farlo automaticamente? Vedi sotto:

sospendere / riprendere lo 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

scorrimento con due dita del touchpad e script di scorciatoie da tastiera

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"

Questo sembra essere un duplicato di askubuntu.com/questions/226278/run-script-on-wakeup/483714 . Vedi anche il mio commento su askubuntu.com/a/483714/170127 .
Jamadagni,

Risposte:


41

È possibile posizionare gli script nella /etc/pm/sleep.ddirectory per eseguirli dopo la sospensione. Sarà necessario aggiungere un condizionale per eseguire lo script solo durante il ripristino e non anche durante il processo di sospensione. Ad esempio, lo script del tuo touchpad sarebbe simile a:

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

Assicurati che il tuo script sia contrassegnato come eseguibile a livello globale e cambia $ USER con il nome utente corrispondente.

Puoi trovare informazioni più dettagliate nella manpage pm-suspend ( man pm-suspend) o guardando la documentazione in /usr/share/doc/pm-utils(in particolare /usr/share/doc/pm-utils/HOWTO.hooks.gz).


2
Può essere chiamato come preferisci. È una buona idea avviarlo con un numero compreso tra 00-49, per la manpage pm-suspend: "00 - 49 Utenti e la maggior parte degli hook forniti dal pacchetto. Se un hook presume che tutti i normali servizi e l'infrastruttura dello spazio utente siano ancora in esecuzione, dovrebbe essere qui ".
dissolvenza

3
Un'altra risposta (ora eliminata) ha avuto questo: 'si prega di notare la seguente segnalazione di bug: launchpad.net/ubuntu/+source/pm-utils/+bug/1455097 dopo aver inserito l'upgrade a script vividi, è necessario inserire /lib/systemd/system-sleep/"
Wilf

8
Su Ubuntu 15.10 , lo script deve essere in /lib/systemd/system-sleep/invece di /etc/pm/sleep.
Marc Belmont,

7
Su Ubuntu 16.04 gli argomenti forniti allo script sono preprima di inserire suspend e postdopo resume invece di suspenderesume
Germar,

3
Ho provato gli ultimi due commenti qui su yakkety (16.10), e non ha funzionato. Come risolvere?
Gringo Suave,

7

Su Ubuntu 16.04 ho dovuto creare un servizio in questo modo:

  1. crea file

    sudo gedit /etc/systemd/system/somename.service
  2. metti dentro

    [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. abilitare il servizio

    sudo systemctl enable somename
  4. (facoltativo) se non funziona dopo aver ripreso dalla sospensione> verifica la presenza di errori con

    journalctl -u somename.service

Questo sembra funzionare anche su Ubuntu 18.04, grazie!
Kelunik,

Perché Ubuntu lascia /etc/pm/sleep.d in giro se non lo usa? È confuso e fuorviante.
Jonathan Neufeld il

Questo ha funzionato per me su Ubuntu 18.04 (in realtà KDE Neon), ma ho dovuto a): Sotto [Service], inserisci User = tim in modo che lo script venga eseguito come il mio utente b) nel mio script, DISPLAY =: 0.0; DISPLAY di esportazione
Tim Richardson

3

Apri questo file:

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

Contenuto:

#! / Bin / sh

caso $ 1 in 
  inviare)
    /usr/lib/pm-utils/power.d/95hdparm-apm resume
    ## Incolla il tuo comando per eseguire lo script
    ;; esac

Il tuo comando verrà eseguito con i privilegi di amministratore .

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.