このudevルールがトリガーされないのはなぜですか?

このudevルールがトリガーされないのはなぜですか?

/etc/udev/rules.d/usbmount.rulesに、次の内容を含むudevルールファイルがあります。

ACTION=="add", KERNEL=="sd*[!0-9]", RUN+="/tmp/debug.sh"

ルールを作成した後、次のことを行いました。

chmod +x /tmp/debug.sh
udevadm control --reload-rules

この規則の目的は、USBブロックデバイス(サムドライブ、ハードドライブなど)が接続されているときにスクリプトを実行することです。なぜ始動がかからないのか知りたいです。udevadmmonitorUSBハードドライブドックがUSB 3.0ポートを介してシステムに接続されると、Aは次のメッセージを表示します。

KERNEL[367.932459] add      /devices/platform/scb/fd500000.pcie/pci0000:00/0000:00:00.0/0000:01:00.0/usb2/2-2 (usb)
KERNEL[367.934622] add      /devices/platform/scb/fd500000.pcie/pci0000:00/0000:00:00.0/0000:01:00.0/usb2/2-2/2-2:1.0 (usb)
KERNEL[367.935236] add      /devices/platform/scb/fd500000.pcie/pci0000:00/0000:00:00.0/0000:01:00.0/usb2/2-2/2-2:1.0/host0 (scsi)
KERNEL[367.935301] add      /devices/platform/scb/fd500000.pcie/pci0000:00/0000:00:00.0/0000:01:00.0/usb2/2-2/2-2:1.0/host0/scsi_host/host0 (scsi_host)
KERNEL[367.935414] bind     /devices/platform/scb/fd500000.pcie/pci0000:00/0000:00:00.0/0000:01:00.0/usb2/2-2/2-2:1.0 (usb)
KERNEL[367.935527] bind     /devices/platform/scb/fd500000.pcie/pci0000:00/0000:00:00.0/0000:01:00.0/usb2/2-2 (usb)
UDEV  [367.937750] add      /devices/platform/scb/fd500000.pcie/pci0000:00/0000:00:00.0/0000:01:00.0/usb2/2-2 (usb)
UDEV  [367.939195] add      /devices/platform/scb/fd500000.pcie/pci0000:00/0000:00:00.0/0000:01:00.0/usb2/2-2/2-2:1.0 (usb)
UDEV  [367.939940] add      /devices/platform/scb/fd500000.pcie/pci0000:00/0000:00:00.0/0000:01:00.0/usb2/2-2/2-2:1.0/host0 (scsi)
UDEV  [367.945817] add      /devices/platform/scb/fd500000.pcie/pci0000:00/0000:00:00.0/0000:01:00.0/usb2/2-2/2-2:1.0/host0/scsi_host/host0 (scsi_host)
UDEV  [367.947464] bind     /devices/platform/scb/fd500000.pcie/pci0000:00/0000:00:00.0/0000:01:00.0/usb2/2-2/2-2:1.0 (usb)
UDEV  [367.950394] bind     /devices/platform/scb/fd500000.pcie/pci0000:00/0000:00:00.0/0000:01:00.0/usb2/2-2 (usb)
KERNEL[368.957786] add      /devices/platform/scb/fd500000.pcie/pci0000:00/0000:00:00.0/0000:01:00.0/usb2/2-2/2-2:1.0/host0/target0:0:0 (scsi)
KERNEL[368.957902] add      /devices/platform/scb/fd500000.pcie/pci0000:00/0000:00:00.0/0000:01:00.0/usb2/2-2/2-2:1.0/host0/target0:0:0/0:0:0:0 (scsi)
KERNEL[368.957993] add      /devices/platform/scb/fd500000.pcie/pci0000:00/0000:00:00.0/0000:01:00.0/usb2/2-2/2-2:1.0/host0/target0:0:0/0:0:0:0/scsi_device/0:0:0:0 (scsi_device)
KERNEL[368.958128] add      /devices/platform/scb/fd500000.pcie/pci0000:00/0000:00:00.0/0000:01:00.0/usb2/2-2/2-2:1.0/host0/target0:0:0/0:0:0:0/scsi_generic/sg0 (scsi_generic)
KERNEL[368.958250] add      /devices/platform/scb/fd500000.pcie/pci0000:00/0000:00:00.0/0000:01:00.0/usb2/2-2/2-2:1.0/host0/target0:0:0/0:0:0:0/bsg/0:0:0:0 (bsg)
KERNEL[368.960906] add      /devices/platform/scb/fd500000.pcie/pci0000:00/0000:00:00.0/0000:01:00.0/usb2/2-2/2-2:1.0/host0/target0:0:0/0:0:0:0/scsi_disk/0:0:0:0 (scsi_disk)
UDEV  [368.961035] add      /devices/platform/scb/fd500000.pcie/pci0000:00/0000:00:00.0/0000:01:00.0/usb2/2-2/2-2:1.0/host0/target0:0:0 (scsi)
UDEV  [368.965594] add      /devices/platform/scb/fd500000.pcie/pci0000:00/0000:00:00.0/0000:01:00.0/usb2/2-2/2-2:1.0/host0/target0:0:0/0:0:0:0 (scsi)
UDEV  [368.971313] add      /devices/platform/scb/fd500000.pcie/pci0000:00/0000:00:00.0/0000:01:00.0/usb2/2-2/2-2:1.0/host0/target0:0:0/0:0:0:0/scsi_device/0:0:0:0 (scsi_device)
UDEV  [368.973129] add      /devices/platform/scb/fd500000.pcie/pci0000:00/0000:00:00.0/0000:01:00.0/usb2/2-2/2-2:1.0/host0/target0:0:0/0:0:0:0/bsg/0:0:0:0 (bsg)
UDEV  [368.975431] add      /devices/platform/scb/fd500000.pcie/pci0000:00/0000:00:00.0/0000:01:00.0/usb2/2-2/2-2:1.0/host0/target0:0:0/0:0:0:0/scsi_generic/sg0 (scsi_generic)
UDEV  [368.976153] add      /devices/platform/scb/fd500000.pcie/pci0000:00/0000:00:00.0/0000:01:00.0/usb2/2-2/2-2:1.0/host0/target0:0:0/0:0:0:0/scsi_disk/0:0:0:0 (scsi_disk)
KERNEL[369.010196] add      /devices/virtual/bdi/8:0 (bdi)
UDEV  [369.011230] add      /devices/virtual/bdi/8:0 (bdi)
KERNEL[369.270352] add      /devices/platform/scb/fd500000.pcie/pci0000:00/0000:00:00.0/0000:01:00.0/usb2/2-2/2-2:1.0/host0/target0:0:0/0:0:0:0/block/sda (block)
KERNEL[369.270455] add      /devices/platform/scb/fd500000.pcie/pci0000:00/0000:00:00.0/0000:01:00.0/usb2/2-2/2-2:1.0/host0/target0:0:0/0:0:0:0/block/sda/sda1 (block)
KERNEL[369.276694] bind     /devices/platform/scb/fd500000.pcie/pci0000:00/0000:00:00.0/0000:01:00.0/usb2/2-2/2-2:1.0/host0/target0:0:0/0:0:0:0 (scsi)
UDEV  [369.874116] add      /devices/platform/scb/fd500000.pcie/pci0000:00/0000:00:00.0/0000:01:00.0/usb2/2-2/2-2:1.0/host0/target0:0:0/0:0:0:0/block/sda (block)
UDEV  [370.252695] add      /devices/platform/scb/fd500000.pcie/pci0000:00/0000:00:00.0/0000:01:00.0/usb2/2-2/2-2:1.0/host0/target0:0:0/0:0:0:0/block/sda/sda1 (block)
UDEV  [370.275646] bind     /devices/platform/scb/fd500000.pcie/pci0000:00/0000:00:00.0/0000:01:00.0/usb2/2-2/2-2:1.0/host0/target0:0:0/0:0:0:0 (scsi)

機械情報:

OS: Raspbian GNU/Linux 10 (buster)
Kernel: 5.4.72-v7l+

debug.shの唯一の内容はecho "TESTING" >> /tmp/debuglog.txt。 Debuglog.txt が生成されませんでした。

このルールが実行されていないようです。なぜ?この問題を解決するにはどうすればよいですか?

答え1

これdebug.shの唯一のコンテンツはいecho "TESTING" >> /tmp/debuglog.txt。 Debuglog.txt が生成されませんでした。

ここに問題があります。#!/bin/bashカーネルは実行を委任することを強制しないため、これらのシェルスクリプトは実行しません。強く打つ通訳者。

ほとんどのツールは、すぐに実行されない場合はコマンドを実行するためにシェルを使用するため、これはほとんど発生しません。これは次の場合の例です。perlを使用してこのコマンドを実行します(また、スクリプトの実行をすぐに失敗させるツールを成功させずに検索します)。

$ strace -e execve perl -e 'exec ("/tmp/debug.sh");'
execve("/usr/bin/perl", ["perl", "-e", "exec (\"/tmp/debug.sh\");"], [/* 15 vars */]) = 0
execve("/tmp/debug.sh", ["/tmp/debug.sh"], [/* 15 vars */]) = -1 ENOEXEC (Exec format error)
execve("/bin/sh", ["/bin/sh", "/tmp/debug.sh"], [/* 15 vars */]) = 0
--- SIGCHLD {si_signo=SIGCHLD, si_code=CLD_EXITED, si_pid=14452, si_uid=1000, si_status=0, si_utime=0, si_stime=0} ---
+++ exited with 0 +++

まず、最初の行でインタプリタなしでスクリプトを実行しようとし、次のようになります。

ENOEXEC (Exec format error)

その後、ケースを再挿入してみてください。ここではこの環境に/bin/shもないbashので、スクリプトにbash構文が含まれていると、後で微妙に誤動作します。

もともとは/tmp/debug.sh次のようでした(u+rxパーマ含む)。

#!/bin/bash
echo "TESTING" >> /tmp/debuglog.txt

それから:

$ strace -e execve perl -e 'exec ("/tmp/debug.sh");'
execve("/usr/bin/perl", ["perl", "-e", "exec (\"/tmp/debug.sh\");"], [/* 15 vars */]) = 0
execve("/tmp/debug.sh", ["/tmp/debug.sh"], [/* 15 vars */]) = 0
--- SIGCHLD {si_signo=SIGCHLD, si_code=CLD_EXITED, si_pid=14474, si_uid=1000, si_status=0, si_utime=0, si_stime=0} ---
+++ exited with 0 +++

その後、/tmp/debug.shカーネルによって直接実行されます(効果的に実行を延期します/bin/bash)。

udevこれを試していないので、有効なバイナリが必要です。カーネル用コマンドの最初のファイルとして。直接提供するか、その行から始めて、カーネルの観点から十分に実行可能なスクリプトを提供してください#!/path/to/interpreter

答え2

一部のシステム(すべて?)のudevには、すべてのスクリプトを実行するための絶対パスが必要です。シェルスクリプトを実行するには、シェルを指定する必要があります。それが機能するには、次のように変更する必要がありました。

ACTION=="add", KERNEL=="sd*[!0-9]", RUN+="/bin/bash /tmp/debug.sh"

関連情報