“inputattach”无法在暂停/恢复后继续存在

“inputattach”无法在暂停/恢复后继续存在

我已经阅读了大量关于暂停/恢复的内容,在这里和其他互联网资源中,并尝试了无数(太多了,无法在此引用)给出的提示;但都是徒劳的......

我的设置需要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

这是“服务”部分之前的部分,您可以在其中定义您的任何需求。

相关内容