パラメータを使用してudevでsystemdサービスを(正しく)呼び出す方法は?

パラメータを使用してudevでsystemdサービスを(正しく)呼び出す方法は?

USBストレージデバイスが接続されているときは、udevでsystemdサービスを起動し、デバイス情報(名前)を自分のサービスに渡してスクリプトに提供しようとしています。

udevルール(/etc/udev/rules.d/99-foo.rules)を作成しました。

ACTION=="add", KERNEL=="sd?", SUBSYSTEM=="block", ENV{ID_BUS}=="usb", TAG+="systemd", PROGRAM="/bin/systemd-escape -p %k", ENV{SYSTEMD_WANTS}+="bar@%c.service"

私のシステムサービス(/etc/systemd/system/bar.service)は比較的基本的です。

[Unit]
Description=Script to do stuff with inserted device.

[Service]
Type=oneshot
ExecStart=/root/bin/usbhook %I

[Install]
WantedBy=multi-user.target

USBドライブが接続されていることを確認すると、/var/log/syslogドライブはコンピュータで認識されますが、私のsystemdサービスは開始されません。

Jan  1 18:58:18 metapi kernel: [ 4542.190520] usb 1-1: New USB device found, idVendor=0781, idProduct=55a5, bcdDevice= 1.00
Jan  1 18:58:18 metapi kernel: [ 4542.190547] usb 1-1: New USB device strings: Mfr=1, Product=2, SerialNumber=3
Jan  1 18:58:18 metapi kernel: [ 4542.190560] usb 1-1: Product: Cruzer Snap
Jan  1 18:58:18 metapi kernel: [ 4542.190571] usb 1-1: Manufacturer: SanDisk
Jan  1 18:58:18 metapi kernel: [ 4542.190584] usb 1-1: SerialNumber: 4C530000180521234567
Jan  1 18:58:18 metapi kernel: [ 4542.211636] usb-storage 1-1:1.0: USB Mass Storage device detected
Jan  1 18:58:18 metapi kernel: [ 4542.225388] scsi host0: usb-storage 1-1:1.0
Jan  1 18:58:19 metapi mtp-probe: checking bus 1, device 22: "/sys/devices/platform/soc/20980000.usb/usb1/1-1"
Jan  1 18:58:19 metapi mtp-probe: bus: 1, device: 22 was not an MTP device
Jan  1 18:58:19 metapi mtp-probe: checking bus 1, device 22: "/sys/devices/platform/soc/20980000.usb/usb1/1-1"
Jan  1 18:58:19 metapi mtp-probe: bus: 1, device: 22 was not an MTP device
Jan  1 18:58:19 metapi kernel: [ 4543.230653] scsi 0:0:0:0: Direct-Access     SanDisk  Cruzer Snap      1.00 PQ: 0 ANSI: 6
Jan  1 18:58:19 metapi kernel: [ 4543.232528] sd 0:0:0:0: [sda] 250085376 512-byte logical blocks: (128 GB/119 GiB)
Jan  1 18:58:19 metapi kernel: [ 4543.234365] sd 0:0:0:0: [sda] Write Protect is off
Jan  1 18:58:19 metapi kernel: [ 4543.234392] sd 0:0:0:0: [sda] Mode Sense: 43 00 00 00
Jan  1 18:58:19 metapi kernel: [ 4543.235109] sd 0:0:0:0: [sda] Write cache: disabled, read cache: enabled, doesn't support DPO or FUA
Jan  1 18:58:19 metapi kernel: [ 4543.236616] sd 0:0:0:0: Attached scsi generic sg0 type 0
Jan  1 18:58:19 metapi kernel: [ 4543.266857]  sda: sda1
Jan  1 18:58:20 metapi kernel: [ 4543.274096] sd 0:0:0:0: [sda] Attached SCSI removable disk

私はudevルールとsystemdスクリプトが正しく機能すると信じています。引数を渡さないudevルールを置き換えると、ACTION=="add", KERNEL=="sd?", SUBSYSTEM=="block", ENV{ID_BUS}=="usb", TAG+="systemd", ENV{SYSTEMD_WANTS}+="bar.service"systemdスクリプトが起動します。

...
Jan  1 19:03:27 metapi kernel: [ 4850.274286] sd 0:0:0:0: [sda] 250085376 512-byte logical blocks: (128 GB/119 GiB)
Jan  1 19:03:27 metapi kernel: [ 4850.275523] sd 0:0:0:0: Attached scsi generic sg0 type 0
Jan  1 19:03:27 metapi kernel: [ 4850.276057] sd 0:0:0:0: [sda] Write Protect is off
Jan  1 19:03:27 metapi kernel: [ 4850.276081] sd 0:0:0:0: [sda] Mode Sense: 43 00 00 00
Jan  1 19:03:27 metapi kernel: [ 4850.276840] sd 0:0:0:0: [sda] Write cache: disabled, read cache: enabled, doesn't support DPO or FUA
Jan  1 19:03:27 metapi kernel: [ 4850.309435]  sda: sda1
Jan  1 19:03:27 metapi kernel: [ 4850.316819] sd 0:0:0:0: [sda] Attached SCSI removable disk
Jan  1 19:03:27 metapi systemd[1]: Starting Script to do stuff with inserted device....

答え1

これは議論ではありません。提供するいいえ議論。それはインスタンス名一つのためにテンプレートユニット

… …あなたは..しませんでした。インスタンスを起動しようとしていますが、インスタンス化するテンプレートサービスユニットは[email protected]ありません。[email protected]

答え2

サービス名に「@」を追加する必要があります。このように:

sudo mv /etc/systemd/system/bar.service /etc/systemd/system/[email protected]

このチュートリアルでは、パラメータを渡すために名前に "@"も追加します。http://blog.fraggod.net/2012/06/16/proper-ish-way-to-start-long-running-systemd-service-on-udev-event-device-hotplug.html

関連情報