USB接続/切断のudevルールがトリガーされない

USB接続/切断のudevルールがトリガーされない

私は RHEL6 を実行しており、USB デバイスを接続および削除するとトリガーされる udev ルールを作成しようとしています。in というファイルを作成し80-usb.rules/etc/udev/rules.d/次の内容を指定しました (今のところあまり具体的な内容はなく、単にテストしたいだけです)。

ACTION=="add", SUBSYSTEMS=="usb", RUN+="touch /tmp/test"

ファイルを保存し、USB ドライブを接続してテストしました。しかし、ファイルは/tmp/test作成されませんでした。

USB ドライブ上で実行できudevadm info、親デバイスの少なくとも 1 つに属性があるため、 udev ルールは USB ドライブと一致するはずだと考えていますSUBSYSTEMS=="usb"

udev ルールがトリガーされないのはなぜでしょうか?

実行してみると、書き込んだファイルが処理され、ルールが一致していることudevadm test --action=add /path/to/deviceは明らかです。出力から関連する行をいくつか示します。.rules

parse_file: reading '/etc/udev/rules.d/80-usb.rules' as rules file
udev_rules_apply_to_event: RUN '/bin/touch /tmp/test' /etc/udev/rules.d/80-usb.rules:1
udevadm_test: run: '/bin/touch /tmp/test'

しかし、まだ/tmp/test存在しません。とても混乱しています。明らかにこのルールは一致しており、ルールが適用されています。では、指定されたコマンドがRUN実行されないのはなぜですか?

答え1

ルールでは実行可能ファイルの絶対パスを指定する必要があります:

ACTION=="add", SUBSYSTEMS=="usb", RUN+="/usr/bin/touch /tmp/test"

編集:

スクリプトを実行する場合は、どのシェルで実行するかを指定する必要があります。

ACTION=="add", SUBSYSTEMS=="usb", RUN+="/bin/sh /path/to/your/script"

答え2

次の点を確認する必要があります。

  • コマンド内のパスはRUN絶対パスである必要があります
  • ファイルは実行可能である必要がある
  • 環境PATHはコマンドの実行範囲内に制限されます

まずこのスクリプトファイルを/lib/udev/touch.sh

vim /lib/udev/touch.sh

そのファイルに次のように記述します:

#!/bin/bash
touch /tmp/test

実行可能にする:

chmod +x /lib/udev/touch.sh

ルール ファイルを次のように変更します。

ACTION=="add", SUBSYSTEMS=="usb", RUN+="/lib/udev/touch.sh"

udevルールを再読み込みする

udevadm control --reload-rules

これにより、ルールが/lib/udev/rules.d/*再度読み込まれます。変更はこの時点では適用されません。

udev は縮小された環境でスクリプトを実行することに注意してくださいPATH。設定されたパス内にないバイナリには、フルパスでアクセスする必要があります。PATHスクリプト内で環境を拡張することもできます。

setラッパー スクリプトからの出力をログ ファイルに記録して、定義されているパスを確認します。

set >>/tmp/udev-env-test

次のようになります:

PATH='/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin'

関連情報