USB接続/分離のためのUdevルールはトリガされません。

USB接続/分離のためのUdevルールはトリガされません。

私はRHEL6を実行していてUSBデバイスを挿入して削除するときにトリガーされるudevルールを作成しようとしています。80-usb.rules呼び出されたファイルを生成し、/etc/udev/rules.d/次の内容を提供しました(まだ具体的な内容はないのでテストしてみたかったです)。

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

テストのためにファイルを保存し、USBドライブを接続しました。ただし、ファイルは/tmp/test生成されません。

udevadm infoUSBドライブで実行でき、親デバイスの少なくとも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'

関連情報