як виконати команду після резюме від призупинення?


44

У мене є сценарій, який виконується для того, щоб призупинити / відновити роботу в своєму ноутбуці. Тоді у мене є ще один ряд xinput, xkbsetі xmodmapкоманди, які виконуються , коли почати сеанс , щоб мати два пальця прокрутка і поєднання клавіш настройки. Коли я відновлю призупинення, прокручування двома пальцями та комбінації клавіш не працюватимуть. Мені потрібно вручну виконати команди в другому файлі ще раз. Як я можу додати їх до сценарію призупинення / відновлення, щоб це було зроблено автоматично? Дивіться нижче:

призупинити / відновити сценарій

/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

тачпад прокрутки двома пальцями та клавіші швидкого доступу до клавіатури

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"

Це здається дублікатом askubuntu.com/questions/226278/run-script-on-wakeup/483714 . Дивіться також мій коментар на сайті askubuntu.com/a/483714/170127 .
джамадагні

Відповіді:


41

Ви можете розмістити свої сценарії в /etc/pm/sleep.dкаталозі, щоб вони запустили після призупинення. Вам потрібно буде додати умовне, щоб ваш сценарій запускався лише під час відновлення, а не під час призупинення. Наприклад, ваш сценарій сенсорної панелі виглядатиме так:

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

Переконайтесь, що ваш сценарій позначений у глобальному масштабі, і змініть $ USER на відповідне ім'я користувача.

Ви можете знайти більш детальну інформацію на сторінці вечірнього призупинення ( man pm-suspend) або переглянувши документацію /usr/share/doc/pm-utils(зокрема /usr/share/doc/pm-utils/HOWTO.hooks.gz).


2
Його можна назвати, що завгодно. Добре запустити його з числа між 00-49, на вечірній призупиненій сторінці: "00 - 49 Користувачі та більшість гачків, що постачаються у пакеті. Якщо гачок передбачає, що всі звичайні сервіси та інфраструктура простору користувачів все ще працюють, це має бути тут ».
фейдер

3
Інша відповідь (тепер видалена) мала такий: "Будь ласка, зверніть увагу на такий звіт про помилку: launchpad.net/ubuntu/+source/pm-utils/+bug/1455097 після оновлення до яскравих сценаріїв потрібно ввести /lib/systemd/system-sleep/"
Wilf

8
У Ubuntu 15.10 сценарій має бути /lib/systemd/system-sleep/замість /etc/pm/sleep.
Марк Белмонт

7
У Ubuntu 16.04 аргументи, наведені до сценарію, є preперед тим, як ввести призупинення та postпісля відновлення замість suspendіresume
Гермар

3
Спробував тут два останні коментарі на yakkety (16.10), і це не спрацювало. Як усунути неполадки?
Gringo Suave

7

У Ubuntu 16.04 мені довелося створити сервіс таким чином:

  1. створити файл

    sudo gedit /etc/systemd/system/somename.service
  2. покласти всередину

    [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. включити обслуговування

    sudo systemctl enable somename
  4. (необов’язково), якщо не працює після відновлення призупинення> перевірити на наявність помилок

    journalctl -u somename.service

Це також, здається, працює на Ubuntu 18.04, дякую!
kelunik

Чому Ubuntu залишає /etc/pm/sleep.d лежати, якщо він не використовує його? Це заплутано і вводить в оману.
Джонатан Нойфельд

Це працювало для мене на ubuntu 18.04 (насправді KDE Neon), але мені довелося:): В розділі [Сервіс] введіть User = tim, щоб сценарій запускався як мій користувач b) у моєму сценарії, зробіть DISPLAY =: 0,0; експорт ДИСПЛЕЙ
Тім Річардсон

3

Відкрити цей файл:

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

Зміст:

#! / бін / ш

справа $ 1 в 
  повідомлення)
    /usr/lib/pm-utils/power.d/95hdparm-apm резюме
    ## Вставте свою команду для запуску сценарію
    ;; есак

Ваша команда буде виконуватись з правами адміністратора .

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.