bagaimana cara menjalankan perintah setelah melanjutkan dari menangguhkan?

44

Saya punya skrip yang dijalankan untuk menunda / melanjutkan bekerja di laptop saya. Kemudian saya memiliki seri lain xinput, xkbsetdan xmodmapperintah yang dieksekusi ketika saya memulai sesi untuk memiliki dua jari bergulir dan pintasan keyboard diatur. Saat saya melanjutkan dari penangguhan, pengguliran dua jari dan pintasan keyboard saya tidak akan berfungsi. Saya perlu menjalankan perintah dalam file kedua secara manual lagi. Bagaimana saya bisa menambahkannya ke skrip ditangguhkan / melanjutkan untuk melakukan ini secara otomatis? Lihat di bawah:

menangguhkan / melanjutkan skrip

/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

skrip bergulir dua jari dan skrip pintas keyboard

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
sumber
Ini tampaknya merupakan duplikat dari askubuntu.com/questions/226278/run-script-on-wakeup/483714 . Lihat juga komentar saya di askubuntu.com/a/483714/170127 .
jamadagni

Jawaban:

41

Anda dapat menempatkan skrip Anda di /etc/pm/sleep.ddirektori untuk menjalankannya setelah ditangguhkan. Anda perlu menambahkan persyaratan untuk membuat skrip Anda berjalan hanya selama resume dan tidak selama proses penangguhan juga. Misalnya, skrip touchpad Anda akan terlihat seperti:

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

Pastikan skrip Anda ditandai dapat dieksekusi secara global dan ubah $ USER ke nama pengguna yang sesuai.

Anda dapat menemukan informasi lebih rinci di halaman pm-suspend ( man pm-suspend) atau dengan melihat dokumentasi di /usr/share/doc/pm-utils(khususnya /usr/share/doc/pm-utils/HOWTO.hooks.gz).

fader
sumber
2
Itu bisa disebut apapun yang kamu suka. Adalah ide yang baik untuk memulainya dengan angka antara 00-49, per manual pm-suspend: "00 - 49 Pengguna dan sebagian besar paket yang disediakan kait. Jika sebuah kait mengasumsikan bahwa semua layanan dan infrastruktur ruang pengguna yang biasa masih berjalan, seharusnya ada di sini. "
fader
3
Lain (sekarang dihapus) jawaban memiliki ini: 'harap dicatat laporan bug berikut: launchpad.net/ubuntu/+source/pm-utils/+bug/1455097 setelah upgrade ke script hidup perlu dimasukkan ke dalam /lib/systemd/system-sleep/'
Wilf
8
Pada Ubuntu 15.10 , script harus di /lib/systemd/system-sleep/bukannya /etc/pm/sleep.
Marc Belmont
7
Pada Ubuntu 16.04 argumen yang diberikan kepada skrip adalah presebelum memasuki penangguhan dan postsetelah melanjutkan alih-alih suspenddanresume
Germar
3
Mencoba dua komentar terakhir di sini pada yakkety (16.10), dan itu tidak berhasil. Bagaimana cara mengatasi masalah?
Gringo Suave
7

Di Ubuntu 16.04 saya harus membuat layanan dengan cara ini:

  1. buat file

    sudo gedit /etc/systemd/system/somename.service
  2. letakkan di dalam

    [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. aktifkan layanan

    sudo systemctl enable somename
  4. (opsional) jika tidak berfungsi setelah melanjutkan dari penangguhan> periksa kesalahan dengan

    journalctl -u somename.service
janot
sumber
Ini sepertinya juga berfungsi di Ubuntu 18.04, terima kasih!
kelunik
Mengapa Ubuntu membiarkan /etc/pm/sleep.d berbaring jika tidak menggunakannya? Ini membingungkan dan menyesatkan.
Jonathan Neufeld
Ini bekerja untuk saya di ubuntu 18.04 (sebenarnya KDE Neon), tetapi saya harus a): Di bawah [Layanan], letakkan Pengguna = tim sehingga skrip berjalan sebagai pengguna saya b) dalam skrip saya, lakukan DISPLAY =: 0.0; export DISPLAY
Tim Richardson
3

Buka file ini:

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

Isi:

#! / bin / sh

case $ 1 in 
  pos)
    /usr/lib/pm-utils/power.d/95hdparm-apm dilanjutkan
    ## Tempel perintah Anda untuk menjalankan skrip Anda
    ;; esac

Perintah Anda akan dijalankan dengan hak istimewa admin .

Abhishek Singh
sumber