udev イベントが複数回トリガーされ、一致条件に準拠していません。

udev イベントが複数回トリガーされ、一致条件に準拠していません。

ラップトップの電源コードを接続するときにトリガーされるudevルールを作成しようとしましたが、プラグを差し込んだり抜いたりすると何度もトリガーされる奇妙な問題が発生しました。

まず、デバイス名を確認してください。

$ udevadm monitor --subsystem-match power_supply

私はすでにサブシステムの名前を知っていますが、実際には重要ではありません。その後、電源コードを接続しました。

KERNEL[771.036377] change   /devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:08/PNP0C09:00/PNP0C0A:00/power_supply/BAT0 (power_supply)
KERNEL[771.553813] change   /devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:08/PNP0C09:00/ACPI0003:00/power_supply/AC (power_supply)
UDEV  [771.603337] change   /devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:08/PNP0C09:00/ACPI0003:00/power_supply/AC (power_supply)
UDEV  [771.791301] change   /devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:08/PNP0C09:00/PNP0C0A:00/power_supply/BAT0 (power_supply)

ここでは4つのイベントがあることがわかります。そのうち2つはBAT0デバイスに属し、2つはACデバイスに属します。
その後、ACデバイスのプロパティを調べて、何がトリガーできるかを確認しました。

$ udevadm info -a /sys/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:08/PNP0C09:00/ACPI0003:00/power_supply/AC

looking at device '/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:08/PNP0C09:00/ACPI0003:00/power_supply/AC':
KERNEL=="AC"
SUBSYSTEM=="power_supply"
DRIVER==""
ATTR{SUBSYSTEM}=="power_supply"
ATTR{POWER_SUPPLY_NAME}=="AC"
ATTR{POWER_SUPPLY_ONLINE}=="1"

looking at parent device '/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:08/PNP0C09:00/ACPI0003:00':
KERNELS=="ACPI0003:00"
SUBSYSTEMS=="acpi"
DRIVERS=="ac"
ATTRS{SUBSYSTEM}=="acpi"
ATTRS{DRIVER}=="ac"
ATTRS{MODALIAS}=="acpi:ACPI0003:"
ATTRS{USEC_INITIALIZED}=="3654374"
ATTRS{ID_VENDOR_FROM_DATABASE}=="The Linux Foundation"

looking at parent device '/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:08/PNP0C09:00':
KERNELS=="PNP0C09:00"
SUBSYSTEMS=="acpi"
DRIVERS=="ec"
ATTRS{SUBSYSTEM}=="acpi"
ATTRS{DRIVER}=="ec"
ATTRS{MODALIAS}=="acpi:PNP0C09:"
ATTRS{USEC_INITIALIZED}=="3588332"
ATTRS{ID_VENDOR_FROM_DATABASE}=="The Linux Foundation"

looking at parent device '/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:08':
KERNELS=="device:08"
SUBSYSTEMS=="acpi"
DRIVERS==""
ATTRS{SUBSYSTEM}=="acpi"

looking at parent device '/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00':
KERNELS=="PNP0A08:00"
SUBSYSTEMS=="acpi"
DRIVERS==""
ATTRS{SUBSYSTEM}=="acpi"
ATTRS{MODALIAS}=="acpi:PNP0A08:PNP0A03:"
ATTRS{USEC_INITIALIZED}=="3301031"
ATTRS{ID_VENDOR_FROM_DATABASE}=="The Linux Foundation"

looking at parent device '/devices/LNXSYSTM:00/LNXSYBUS:00':
KERNELS=="LNXSYBUS:00"
SUBSYSTEMS=="acpi"
DRIVERS==""
ATTRS{SUBSYSTEM}=="acpi"
ATTRS{MODALIAS}=="acpi:LNXSYBUS:"
ATTRS{USEC_INITIALIZED}=="3246891"
ATTRS{ID_VENDOR_FROM_DATABASE}=="The Linux Foundation"

looking at parent device '/devices/LNXSYSTM:00':
KERNELS=="LNXSYSTM:00"
SUBSYSTEMS=="acpi"
DRIVERS==""
ATTRS{SUBSYSTEM}=="acpi"
ATTRS{MODALIAS}=="acpi:LNXSYSTM:"
ATTRS{USEC_INITIALIZED}=="3107859"
ATTRS{ID_VENDOR_FROM_DATABASE}=="The Linux Foundation"

これにより、デバイス自体と親デバイスのプロパティを使用してできるだけ具体的に説明するために、次のルールを作成しました。

ACTION=="change"
SUBSYSTEM=="power_supply"
DRIVERS=="ac"
ATTR{POWER_SUPPLY_NAME}=="AC"
ATTR{POWER_SUPPLY_ONLINE}=="1"
RUN+="/usr/bin/bash /home/josh/scripts/udev_sleep.sh"

それを保存し、ラップトップを取り外して再接続した後、スクリプトが10回実行されたことがわかりました。モニターに4つのイベントのみが表示されている場合(そのうちの1つを除いてすべて一致してはいけません)、この現象が発生した理由を追跡する方法はありますか?

しかし、おそらくより一般的な問題があるかもしれません。ルールに明らかに一致しない条件が含まれていても、ルールが実行されることがわかったからです。

ACTION=="change"
SUBSYSTEM=="Not even the right subsystem!"
DRIVERS=="ac"
ATTR{POWER_SUPPLY_NAME}=="Totally Fake Name"
ATTR{POWER_SUPPLY_ONLINE}=="Definitely not right"
RUN+="/usr/bin/bash /home/josh/scripts/udev_sleep.sh"

マッチング方式が何か間違っているようですが、私が考えたものとは違うのですか?私はudevのマニュアルページを読んでおり、すべてのオンライン例は同様のパターンに従うようです。

ベストアンサー1

おすすめ記事