如何在暂停恢复后执行命令?

如何在暂停恢复后执行命令?

我有一个脚本,用于在笔记本电脑中执行暂停/恢复功能。然后,我还有另一系列的xinputxkbset命令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"

答案1

您可以将脚本放在/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 更改为相应的用户名。

您可以在 pm-suspend 手册页 ( man pm-suspend) 中或通过查看文档/usr/share/doc/pm-utils(特别是/usr/share/doc/pm-utils/HOWTO.hooks.gz)找到更详细的信息。

答案2

在 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
    

答案3

打开此文件:

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

内容:

/bin/sh #!/bin/sh 复制代码

案例 $1
  邮政)
    /usr/lib/pm-utils/power.d/95hdparm-apm 恢复
    ## 粘贴命令来运行脚本
    ;; 埃萨克

你的命令将执行管理权限

答案4

这是我用来在恢复后重新启动 VPN 守护程序的版本:

#!/bin/sh

case "$1" in
        pre)
                echo "$(date) - $1: Restarting norvpnd" >> /tmp/nordvpn/suspend.txt
                /usr/bin/systemctl restart nordvpnd
                ;;
        post)
                echo "$(date)-  $1: Doing nothing" >> /tmp/nordvpn/suspend.txt
                ;;
esac

该文件被放入:

/lib/systemd/system-sleep//00restart_nordvpnd.sh

这在 Ubuntu 20.4 中运行良好。该pre部分在使计算机进入睡眠状态(suspend)之前执行,该post部分在计算机恢复时执行,可以通过查看/tmp/nordvpn/suspend.txt文件来验证这一点。

旁注(与主题无关但值得注意):关于此示例中的任务,在使计算机进入睡眠状态之前重新启动守护进程似乎不合逻辑,但这是(唯一?)它的工作方式。

相关内容