Wie führe ich einen Befehl nach dem Fortsetzen aus?

44

Ich habe ein Skript, das ausgeführt wird, damit das Anhalten / Wiederaufnehmen in meinem Laptop funktioniert. Dann habe ich noch eine Reihe von xinput, xkbsetund xmodmapBefehle , die ausgeführt werden , wenn ich eine Sitzung initiieren Zwei-Finger - Scrollen und Tastenkombinationen zu haben , einzurichten. Wenn ich aus dem Standby-Modus zurückkomme, funktionieren das Scrollen mit zwei Fingern und meine Tastaturkürzel nicht. Ich muss die Befehle in der zweiten Datei erneut manuell ausführen. Wie kann ich diese dem Suspend / Resume-Skript hinzufügen, damit dies automatisch erfolgt? Siehe unten:

Skript anhalten / fortsetzen

/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

Touchpad-Scrollen mit zwei Fingern und Tastaturkürzel-Skript

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"
719016
quelle
Dies scheint ein Duplikat von askubuntu.com/questions/226278/run-script-on-wakeup/483714 zu sein . Siehe auch meinen Kommentar unter askubuntu.com/a/483714/170127 .
Jamadagni

Antworten:

41

Sie können Ihre Skripte in das /etc/pm/sleep.dVerzeichnis stellen, damit sie nach dem Anhalten ausgeführt werden. Sie müssen eine Bedingung hinzufügen, damit Ihr Skript nur während des Fortsetzens und nicht auch während des Unterbrechungsvorgangs ausgeführt wird. Zum Beispiel würde Ihr Touchpad-Skript so aussehen:

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

Stellen Sie sicher, dass Ihr Skript als global ausführbar markiert ist, und ändern Sie $ USER in den entsprechenden Benutzernamen.

Weitere Informationen finden Sie auf der Hilfeseite pm-suspend ( man pm-suspend) oder in der Dokumentation unter /usr/share/doc/pm-utils(insbesondere /usr/share/doc/pm-utils/HOWTO.hooks.gz).

Fader
quelle
2
Es kann so genannt werden, wie Sie möchten. Es ist eine gute Idee, mit einer Zahl zwischen 00-49 zu beginnen, die in der Manpage pm-suspend angegeben ist: "00 - 49 Benutzer- und die meisten im Paket enthaltenen Hooks. Wenn ein Hook davon ausgeht, dass alle üblichen Dienste und die Userspace-Infrastruktur noch ausgeführt werden, es sollte hier sein. "
Fader
3
Eine andere (jetzt gelöschte) Antwort lautete : 'Bitte beachten Sie den folgenden Fehlerbericht: launchpad.net/ubuntu/+source/pm-utils/+bug/1455097 nach dem Upgrade auf lebendige Skripte müssen in /lib/systemd/system-sleep/'
Wilf
8
Unter Ubuntu 15.10 muss sich das Skript /lib/systemd/system-sleep/statt in befinden /etc/pm/sleep.
Marc Belmont
7
Unter Ubuntu 16.04 stehen die Argumente für das Skript prevor der Eingabe von suspend und postnach resume anstelle von suspendundresume
Germar
3
Versuchte die letzten beiden Kommentare hier auf Yakkety (16.10), und es hat nicht funktioniert. Problembehandlung
Gringo Suave
7

Unter Ubuntu 16.04 musste ich den Dienst folgendermaßen erstellen:

  1. erstelle Datei

    sudo gedit /etc/systemd/system/somename.service
  2. reintun

    [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. Dienst aktivieren

    sudo systemctl enable somename
  4. (optional) Wenn nach dem Fortsetzen nach dem Suspendieren nicht funktioniert, prüfen Sie auf Fehler mit

    journalctl -u somename.service
Janot
quelle
Dies scheint auch auf Ubuntu 18.04 zu funktionieren, danke!
Kelunik
Warum lässt Ubuntu /etc/pm/sleep.d herumliegen, wenn es es nicht benutzt? Es ist verwirrend und irreführend.
Jonathan Neufeld
Dies funktionierte für mich unter Ubuntu 18.04 (eigentlich KDE Neon), aber ich musste a): Setzen Sie unter [Service] User = tim, damit das Skript als mein Benutzer ausgeführt wird. B) In meinem Skript tun Sie DISPLAY =: 0.0; export DISPLAY
Tim Richardson
3

Öffnen Sie diese Datei:

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

Inhalt:

#! / bin / sh

Fall $ 1 in 
  Post)
    /usr/lib/pm-utils/power.d/95hdparm-apm resume
    ## Fügen Sie Ihren Befehl ein, um Ihr Skript auszuführen
    ;; esac

Ihr Befehl wird mit Administratorrechten ausgeführt .

Abhishek Singh
quelle