私はRHEL6を実行していてUSBデバイスを挿入して削除するときにトリガーされるudevルールを作成しようとしています。80-usb.rules
呼び出されたファイルを生成し、/etc/udev/rules.d/
次の内容を提供しました(まだ具体的な内容はないのでテストしてみたかったです)。
ACTION=="add", SUBSYSTEMS=="usb", RUN+="touch /tmp/test"
テストのためにファイルを保存し、USBドライブを接続しました。ただし、ファイルは/tmp/test
生成されません。
udevadm info
USBドライブで実行でき、親デバイスの少なくとも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'