
私は 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'