![如何在暂停恢复后执行命令?](https://linux22.com/image/1076603/%E5%A6%82%E4%BD%95%E5%9C%A8%E6%9A%82%E5%81%9C%E6%81%A2%E5%A4%8D%E5%90%8E%E6%89%A7%E8%A1%8C%E5%91%BD%E4%BB%A4%EF%BC%9F.png)
我有一个脚本,用于在笔记本电脑中执行暂停/恢复功能。然后,我还有另一系列的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"
答案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 上,我必须通过以下方式创建服务:
创建文件
sudo gedit /etc/systemd/system/somename.service
放进去
[Unit] Description=Some description Before=sleep.target StopWhenUnneeded=yes [Service] Type=oneshot RemainAfterExit=yes ExecStop=-/path/to/your/script.sh [Install] WantedBy=sleep.target
启用服务
sudo systemctl enable somename
(可选)如果从暂停状态恢复后仍不工作 > 检查错误
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
文件来验证这一点。
旁注(与主题无关但值得注意):关于此示例中的任务,在使计算机进入睡眠状态之前重新启动守护进程似乎不合逻辑,但这是(唯一?)它的工作方式。