Làm thế nào để thực thi một lệnh sau khi tiếp tục từ đình chỉ?


44

Tôi đã có một tập lệnh được thực thi để tạm dừng / tiếp tục hoạt động trong máy tính xách tay của tôi. Sau đó, tôi có một loạt các xinput, xkbsetxmodmapcác lệnh được thực thi khi tôi bắt đầu một phiên có hai ngón tay di chuyển và các phím tắt thiết lập. Khi tôi tiếp tục tạm dừng, cuộn bằng hai ngón tay và các phím tắt trên bàn phím sẽ không hoạt động. Tôi cần phải thực hiện thủ công các lệnh trong tệp thứ hai một lần nữa. Làm cách nào tôi có thể thêm chúng vào tập lệnh tạm dừng / tiếp tục để thực hiện việc này một cách tự động? Xem bên dưới:

đình chỉ / tiếp tục kịch bản

/etc/pm/s ngủ.d / 20_custom-eci_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 cuộn hai ngón tay và tập lệnh phím tắt

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"

Đây dường như là một bản sao của Askubfox.com/questions/226278/run-script-on-wakeup/483714 . Xem thêm bình luận của tôi tại Askubfox.com/a/483714/170127 .
jamadagni

Câu trả lời:


41

Bạn có thể đặt các tập lệnh của bạn trong /etc/pm/sleep.dthư mục để chúng chạy sau khi tạm dừng. Bạn sẽ cần thêm một điều kiện để làm cho tập lệnh của bạn chỉ chạy trong khi tiếp tục và không trong quá trình tạm dừng. Ví dụ: tập lệnh touchpad của bạn sẽ trông như sau:

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

Hãy chắc chắn rằng tập lệnh của bạn được đánh dấu trên toàn cầu và thay đổi $ USER thành tên người dùng tương ứng.

Bạn có thể tìm thấy thông tin chi tiết hơn trong manpage đình chỉ chiều ( man pm-suspend) hoặc bằng cách xem tài liệu trong /usr/share/doc/pm-utils(đặc biệt /usr/share/doc/pm-utils/HOWTO.hooks.gz).


2
Nó có thể được gọi là bất cứ điều gì bạn thích. Bạn nên bắt đầu với một số trong khoảng từ 00-49, trên trang quản lý tạm dừng buổi chiều: "00 - 49 Móc người dùng và hầu hết các gói được cung cấp. Nếu một hook giả định rằng tất cả các dịch vụ thông thường và cơ sở hạ tầng không gian người dùng vẫn đang chạy, nó nên ở đây. "
fader

3
Một câu trả lời khác (hiện đã bị xóa)câu này: 'vui lòng lưu ý báo cáo lỗi sau: launchpad.net/ubfox/+source/pm-utils/+orms/1455097 sau khi nâng cấp lên các tập lệnh sống động cần được đưa vào /lib/systemd/system-sleep/'
Wilf

8
Trên Ubuntu 15.10 , tập lệnh phải được /lib/systemd/system-sleep/thay thế /etc/pm/sleep.
Marc Belmont

7
Trên Ubuntu 16.04, các đối số được đưa ra cho tập lệnh là pretrước khi tạm dừng và postsau khi tiếp tục thay vì suspendresume
Germar

3
Đã thử hai nhận xét cuối cùng ở đây về yakkety (16.10) và nó không hoạt động. Làm thế nào để khắc phục sự cố?
Gringo Suave

7

Trên Ubuntu 16.04 tôi phải tạo dịch vụ theo cách này:

  1. tạo tập tin

    sudo gedit /etc/systemd/system/somename.service
  2. đặt vào trong

    [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. cho phép dịch vụ

    sudo systemctl enable somename
  4. (tùy chọn) nếu không hoạt động sau khi tiếp tục tạm dừng> kiểm tra lỗi với

    journalctl -u somename.service

Điều này dường như cũng hoạt động trên Ubuntu 18.04, cảm ơn!
kelunik

Tại sao Ubuntu lại để /etc/pm/s ngủ.d nằm xung quanh nếu nó không sử dụng? Thật khó hiểu và sai lệch.
Jonathan Neufeld

Điều này hoạt động với tôi trên Ubuntu 18.04 (thực ra là KDE Neon), nhưng tôi đã phải a): Trong [Dịch vụ], đặt User = tim để tập lệnh chạy như người dùng của tôi b) trong tập lệnh của tôi, hãy thực hiện HIỂN THỊ =: 0.0; xuất khẩu HIỂN THỊ
Tim Richardson

3

Mở tệp này:

sudo vim / lib / systemd / system-ngủ / hdparm

Nội dung:

#! / thùng / sh

trường hợp $ 1 trong 
  bài đăng)
    /usr/lib/pm-utils/power.d/95hdparm-apm sơ yếu lý lịch
    ## Dán lệnh của bạn để chạy tập lệnh của bạn
    ;; esac

Lệnh của bạn sẽ thực thi với đặc quyền quản trị viên .

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.