web-dev-qa-db-ja.com

udevルールによって実行されるスクリプトが失敗する

buntu 18.4を実行していますが、-devruleによってトリガーされたときに実行を拒否するスクリプトで問題が発生しました。

これが状況です:私はSurface Pro 4で実行しています。このデバイスには取り外し可能なキーボードがあります。 libinput-gesturesというソフトウェアを実行しています。キーボードを取り外して再度取り付けると、ジェスチャーは機能しません。手動で修正するのは非常に簡単です:

libinput-gestures-setup restart

つまりscript私が実行しようとするのはまさにこれです。ここにその完全な栄光があります:

#!/bin/sh

libinput-gestures-setup restart

Udevルールのaddイベントで実行したいのですが。 .rulesファイルは次のとおりです。

ACTION=="add", ATTRS{idVendor}=="045e", ATTRS{idProduct}=="07e8", RUN+="/home/$myuser/.bin/gestures-restart"

キーボードを取り付けたときにスクリプトを見つけると問題なく動作します。しかし、これはログに記録されるものです:

Apr 20 22:20:51 mb-Surface-Pro-4 kernel: [ 2248.005043] usb 1-7: New USB device strings: Mfr=1, Product=2, SerialNumber=0
Apr 20 22:20:51 mb-Surface-Pro-4 kernel: [ 2248.005047] usb 1-7: Product: Surface Type Cover
Apr 20 22:20:51 mb-Surface-Pro-4 kernel: [ 2248.005050] usb 1-7: Manufacturer: Microsoft
Apr 20 22:20:51 mb-Surface-Pro-4 kernel: [ 2248.013813] input: Microsoft Surface Type Cover Keyboard as /devices/pci0000:00/0000:00:14.0/usb1/1-7/1-7:1.0/0003:045E:07E8.000D/input/input95
Apr 20 22:20:51 mb-Surface-Pro-4 kernel: [ 2248.072209] input: Microsoft Surface Type Cover Consumer Control as /devices/pci0000:00/0000:00:14.0/usb1/1-7/1-7:1.0/0003:045E:07E8.000D/input/input97
Apr 20 22:20:51 mb-Surface-Pro-4 kernel: [ 2248.072444] input: Microsoft Surface Type Cover Touchpad as /devices/pci0000:00/0000:00:14.0/usb1/1-7/1-7:1.0/0003:045E:07E8.000D/input/input99
Apr 20 22:20:51 mb-Surface-Pro-4 kernel: [ 2248.072881] hid-multitouch 0003:045E:07E8.000D: input,hiddev1,hidraw2: USB HID v1.11 Keyboard [Microsoft Surface Type Cover] on usb-0000:00:14.0-7/input0
Apr 20 22:20:51 mb-Surface-Pro-4 mtp-probe: checking bus 1, device 11: "/sys/devices/pci0000:00/0000:00:14.0/usb1/1-7"
Apr 20 22:20:51 mb-Surface-Pro-4 mtp-probe: bus: 1, device: 11 was not an MTP device
Apr 20 22:20:51 mb-Surface-Pro-4 systemd-udevd[5965]: Process '/home/mariusb/.bin/gestures-restart' failed with exit code 1.
Apr 20 22:20:51 mb-Surface-Pro-4 systemd-udevd[5965]: message repeated 2 times: [ Process '/home/mariusb/.bin/gestures-restart' failed with exit code 1.]
Apr 20 22:20:51 mb-Surface-Pro-4 systemd-udevd[5982]: Process '/home/mariusb/.bin/gestures-restart' failed with exit code 1.
Apr 20 22:20:51 mb-Surface-Pro-4 systemd-udevd[5993]: Process '/home/mariusb/.bin/gestures-restart' failed with exit code 1.
Apr 20 22:20:51 mb-Surface-Pro-4 systemd-udevd[5965]: Process '/home/mariusb/.bin/gestures-restart' failed with exit code 1.
Apr 20 22:20:51 mb-Surface-Pro-4 systemd-udevd[5992]: Process '/home/mariusb/.bin/gestures-restart' failed with exit code 1.
Apr 20 22:20:51 mb-Surface-Pro-4 systemd-udevd[5991]: Process '/home/mariusb/.bin/gestures-restart' failed with exit code 1.
Apr 20 22:20:51 mb-Surface-Pro-4 systemd-udevd[5982]: Process '/home/mariusb/.bin/gestures-restart' failed with exit code 1.
Apr 20 22:20:51 mb-Surface-Pro-4 systemd-udevd[6011]: Process '/home/mariusb/.bin/gestures-restart' failed with exit code 1.
Apr 20 22:20:51 mb-Surface-Pro-4 systemd-udevd[5965]: Process '/home/mariusb/.bin/gestures-restart' failed with exit code 1.
Apr 20 22:20:51 mb-Surface-Pro-4 systemd-udevd[5992]: Process '/home/mariusb/.bin/gestures-restart' failed with exit code 1.
Apr 20 22:20:51 mb-Surface-Pro-4 systemd-udevd[5993]: Process '/home/mariusb/.bin/gestures-restart' failed with exit code 1.
Apr 20 22:20:51 mb-Surface-Pro-4 systemd-udevd[5991]: Process '/home/mariusb/.bin/gestures-restart' failed with exit code 1.
Apr 20 22:20:51 mb-Surface-Pro-4 systemd-udevd[6015]: Process '/home/mariusb/.bin/gestures-restart' failed with exit code 1.
Apr 20 22:20:51 mb-Surface-Pro-4 upowerd[868]: unhandled action 'bind' on /sys/devices/pci0000:00/0000:00:14.0/usb1/1-7/1-7:1.0/0003:045E:07E8.000D
Apr 20 22:20:51 mb-Surface-Pro-4 upowerd[868]: unhandled action 'bind' on /sys/devices/pci0000:00/0000:00:14.0/usb1/1-7/1-7:1.0
Apr 20 22:20:51 mb-Surface-Pro-4 upowerd[868]: unhandled action 'bind' on /sys/devices/pci0000:00/0000:00:14.0/usb1/1-7

したがって、ここではスクリプトが問題であるようです。そして、これは私が何が悪いのか理解していないので私が助けを必要とするところです。

追加情報として: libinputをインストールしたとき、ユーザーをグループlibinputに追加する必要がありました。多分それはそれと関係があります

とにかく、事前に感謝します

編集:ユーザーによって実行されていないスクリプトと関係があるようです。 journalctl -xeは以下を出力します:

-- Unit gestures-restart.service has begun starting up.
Apr 20 23:05:44 mb-Surface-Pro-4 gestures-restart[3550]: Non-installation commands must be run as your own user.
Apr 20 23:05:44 mb-Surface-Pro-4 systemd[1]: gestures-restart.service: Main process exited, code=exited, status=1/FAILURE
Apr 20 23:05:44 mb-Surface-Pro-4 systemd[1]: gestures-restart.service: Failed with result 'exit-code'.
Apr 20 23:05:44 mb-Surface-Pro-4 systemd[1]: Failed to start Restart gestures.
-- Subject: Unit gestures-restart.service has failed
-- Defined-By: systemd
-- Support: http://www.ubuntu.com/support
-- 
-- Unit gestures-restart.service has failed.
-- 
-- The result is RESULT.

誰でも今それを修正する方法はありますか?


編集/更新2:


キーボードの接続を検出するサービスを取得しました。正常に動作し、必要に応じて再起動スクリプトを実行します。最新の状態に保つために、これが今の私のサービスです。

[Unit]
Description=Service for restarting gestures
Requires=dev-input-by\x2dpath-pci\x2d0000:00:14.0\x2dusb\x2d0:7:1.0\x2devent\x2dmouse.device
After=dev-input-by\x2dpath-pci\x2d0000:00:14.0\x2dusb\x2d0:7:1.0\x2devent\x2dmouse.device

[Service]
Type=simple
User=$user
ExecStart=/home/$user/.bin/gestures-restart.sh

[Install]
WantedBy=dev-input-by\x2dpath-pci\x2d0000:00:14.0\x2dusb\x2d0:7:1.0\x2devent\x2dmouse.device

libinput-gestures -lは、アプリケーションに関するいくつかの情報を提供します。

libinput-gestures: device /dev/input/by-path/pci-0000:00:14.0-usb-0:7:1.0-event-mouse(event6): Microsoft Surface Type Cover Touchpad

私が理解しているように、これはソフトウェアが入力として使用するデバイスです。だから私はsystemctl list-unitsとこのデバイスが見つかりました:

sys-devices-pci0000:00-0000:00:14.0-usb1-1\x2d7-1\x2d7:1.0-0003:045E:07E8.0004-input-input29-event6.device

(私はそれをevent6プロパティで識別しました)そして、サービスREQUIRE/AFTERに使用しました...

これまでのところ、これはすべて良さそうです。キーボードを切り離して再接続すると、journalctl -xeが次を出力します。

Apr 21 15:22:13 mb-Surface-Pro-4 systemd[1]: Found device Surface_Type_Cover.
-- Subject: Unit dev-input-by\x2dpath-pci\x2d0000:00:14.0\x2dusb\x2d0:7:1.0\x2devent\x2dmouse.device has finished start-up
-- Defined-By: systemd
-- Support: http://www.ubuntu.com/support
-- 
-- Unit dev-input-by\x2dpath-pci\x2d0000:00:14.0\x2dusb\x2d0:7:1.0\x2devent\x2dmouse.device has finished starting up.
-- 
-- The start-up result is RESULT.
Apr 21 15:22:13 mb-Surface-Pro-4 upowerd[886]: unhandled action 'bind' on /sys/devices/pci0000:00/0000:00:14.0/usb1/1-7/1-7:1.0/0003:045E:07E8.0011
Apr 21 15:22:13 mb-Surface-Pro-4 systemd[1]: Started Service for restarting gestures.
-- Subject: Unit gestures-restart.service has finished start-up
-- Defined-By: systemd
-- Support: http://www.ubuntu.com/support
-- 
-- Unit gestures-restart.service has finished starting up.
-- 
-- The start-up result is RESULT.
Apr 21 15:22:13 mb-Surface-Pro-4 upowerd[886]: unhandled action 'bind' on /sys/devices/pci0000:00/0000:00:14.0/usb1/1-7/1-7:1.0
Apr 21 15:22:13 mb-Surface-Pro-4 upowerd[886]: unhandled action 'bind' on /sys/devices/pci0000:00/0000:00:14.0/usb1/1-7
Apr 21 15:22:13 mb-Surface-Pro-4 gestures-restart.sh[5532]: libinput-debug-events stopped.
Apr 21 15:22:13 mb-Surface-Pro-4 gestures-restart.sh[5532]: libinput-gestures stopped.

示されているように、サービスは接続を認識し、sctiptを起動します。次にscrptはSTOP機能を実行しますが、再起動しません。これはこの問題の範囲を超えている可能性があることは知っていますが、これの明らかな理由がわかりますか?ありがとうございました :)

最終更新

ユーティリティの開発者に連絡しました。アプリケーションは実際のユーザーセッションで実行する必要があるため、おそらく開始アクションは失敗します。システムサービスではありません。御時間ありがとうございます。

1
Marius Biegger

方法1:

_$ cat 99-logitech-custom.rules
_
_# Start autorun systemd .service
ACTION=="add", \
SUBSYSTEMS=="input", \
ATTR{name}=="Logitech Performance MX", \
TAG+="systemd", ENV{SYSTEMD_USER_WANTS}="logitech_custom.service"
_

_udevadm control --reload && udevadm trigger_を使用してudevをリロードします。

...そしてシンプルなワンショットsystemd .service

_$ cat ~/.config/systemd/user/logitech_custom.service
_
_Description=Autorun actions for Logitech

[Service]
Type=oneshot
ExecStart=/opt/bin/autorun_logitech.sh
_

.serviceを起動または有効にする必要はありません。


方法2

デバイスを接続すると、_systemctl list-units_リストに表示されます(ユニットとして表示されない場合は、最初にデバイスをTAG + =する必要があります。基本的には最初の方法と同じですが、env {systemd .. 。})。これで、udevadm info $(systemd-escape -u '<unit>' --path | sed 's/.device$//')でこのユニット名を使用して_DEVLINKS=_を取得できます。もう一度_systemd-escape '<devlink>' --path --suffix=device_を介して実行すると、エスケープされた.device名を取得できます。

_$ cat ~/.config/systemd/user/logitech_custom.service
_
_[Unit]
Description=Autorun actions for Logitech mouse
Requires=dev-input-by\x2did-usb\x2dLogitech_USB_Receiver\x2dif02\x2dmouse.device
After=dev-input-by\x2did-usb\x2dLogitech_USB_Receiver\x2dif02\x2dmouse.device

[Service]
ExecStart=/opt/bin/autorun_logitech.sh

[Install]
WantedBy=dev-input-by\x2did-usb\x2dLogitech_USB_Receiver\x2dif02\x2dmouse.device
_


...そして最後にsystemd .serviceを有効にします

_$ systemctl --user enable logitech_custom.service
_
1
bac0n