我已经阅读了大量关于暂停/恢复的内容,在这里和其他互联网资源中,并尝试了无数(太多了,无法在此引用)给出的提示;但都是徒劳的......
我的设置需要inputattach
,这在挂起/恢复时总是有问题,因为它在恢复后没有干净地恢复。我从来没有成功使用 中提供的“钩子” /usr/lib/systemd/system-sleep/
:我的脚本(根据文档中的示例构建)在那里正确(!)在恢复期间运行,但它们没有效果。在journalctl
我可以看到以用户身份执行的脚本、创建的root
进程inputattach
及其列出的 PID:
Mär 04 16:48:42 RudisPC systemd-sleep[18057]: echo "... in test ... $(whoami) -- $1"
Mär 04 16:48:42 RudisPC systemd-sleep[18057]: ... in test ... root -- post
Mär 04 16:48:42 RudisPC systemd-sleep[18057]: case $1 in
Mär 04 16:48:42 RudisPC systemd-sleep[18057]: post)
Mär 04 16:48:42 RudisPC systemd-sleep[18057]: { inputattach -mman /dev/ttyS0 --daemon --always & disown; echo $!; }
Mär 04 16:48:42 RudisPC systemd-sleep[18057]: ;;
Mär 04 16:48:42 RudisPC systemd-sleep[18057]: esac
Mär 04 16:48:42 RudisPC systemd-sleep[18074]: + inputattach -mman /dev/ttyS0 --daemon --always
Mär 04 16:48:42 RudisPC systemd-sleep[18057]: + echo 18074
Mär 04 16:48:42 RudisPC systemd-sleep[18057]: 18074
Mär 04 16:48:42 RudisPC systemd-sleep[18075]: + ps -elfH
Mär 04 16:48:42 RudisPC systemd-sleep[18076]: 0 S root 18074 18057 0 80 0 - 1458 do_sel 16:48 ? 00:00:00 inputattach -mman /dev/ttyS0 --daemon --always
但当resume
完成后,该进程就消失了。它是否需要特殊权限/特权才能被内核接受并持续存在?
inputattach
一个观察结果:在启动时运行,或者在之后手动运行resume
,我看到类似以下条目journalctl
:
Mär 04 16:48:50 RudisPC kernel: serio: Serial port ttyS0
Mär 04 16:48:50 RudisPC kernel: input: Logitech M+ Mouse as /devices/pnp0/00:06/tty/ttyS0/serio7/input/input18
sleep
在-hook中创建进程后它们不会显示出来。
我长期以来的解决方法是使用一个别名,在恢复完成后inputattach
再次运行。自从升级到 20.10 以来,这不再起作用。这可能是因为(现在?)命令systemctl suspend
是异步的,不会等待挂起/恢复循环完成。我不记得升级之前它是什么了。
我在这里做错了什么吗?有什么想法/提示吗?是否有一个聪明的方法dbus
/udev
动作可以做到这一点?
答案1
您应该尝试在 中创建 UDEV 规则/etc/udev/rules.d/
。我假设您想要连接 Logitech 鼠标,因此请输入以下内容来找到正确的规则:
sudo udevadm monitor --environment --udev
插入鼠标并分析上述命令将记录到控制台的数据:(您的数据看起来会有所不同!)
UDEV [43482.659634] 绑定 /devices/pci0000:00/0000:00:1a.0/usb1/1-1/1-1.5/1-1.5.6 (usb) ACTION=bind DEVPATH=/devices/pci0000:00/0000:00:1a.0/usb1/1-1/1-1.5/1-1.5.6 SUBSYSTEM=usb DEVNAME=/dev/bus/usb/001/007 DEVTYPE=usb_device DRIVER=usb PRODUCT=93a/2521/100 TYPE=0/0/0 BUSNUM=001 DEVNUM=007 SEQNUM=3718 USEC_INITIALIZED=43481815203 ID_VENDOR=093a ID_VENDOR_ENC=093a ID_VENDOR_ID=093a ID_MODEL=USB_OPTICAL_MOUSE ID_MODEL_ENC=USB\x20OPTICAL\x20MOUSE ID_MODEL_ID=2521 ID_REVISION=0100 ID_SERIAL=093a_USB_OPTICAL_MOUSE ID_BUS=usb ID_USB_INTERFACES=:030102: ID_VENDOR_FROM_DATABASE=Pixart Imaging, Inc. ID_MODEL_FROM_DATABASE=光电鼠标 ID_PATH=pci-0000:00:1a.0-usb-0:1.5.6 ID_PATH_TAG=pci-0000_00_1a_0-usb-0_1_5_6 ID_FOR_SEAT=usb-pci-0000_00_1a_0-usb-0_1_5_6 MAJOR=189 MINOR=6 TAGS=:座位: CURRENT_TAGS=:座位:
在这种情况下,您可以在上述文件夹中创建一个文件,40-attach.rules
并写入以下规则:
ACTION=="bind", ATTR{idVendor}=="093a",RUN+="/usr/local/sbin/mybashfile.sh"
您必须根据您的数据(不是我的)选择 ATTR 值。
基本思想是,如果 udev 检测到硬件,它将执行“RUN”后的命令。
请注意:这是一个基于插入设备的示例。您将有不同的值,但它应该能让您了解要点。您可以对连接到 PC/笔记本电脑的任何硬件执行相同的操作
更新
这个 Arch Linux文章描述如何将串行设备连接到内核。它可能会帮助您绕过 UDEV 路由 - 这对您来说没有帮助。
列出了另一种方法这里重新唤醒触摸屏。在这两种情况下都使用了 systemd。不是作为钩子(如您尝试的那样),而是作为服务本身。最重要的部分应该是单元定义:
[Unit]
Description=restart your-inputattach service
After=suspend.target
这是“服务”部分之前的部分,您可以在其中定义您的任何需求。