USB 連接/分離的 udev 規則未觸發

USB 連接/分離的 udev 規則未觸發

我正在運行 RHEL6,並且正在嘗試編寫一個在插入和移除 USB 裝置時觸發的 udev 規則。我創建了一個名為80-usb.rulesin 的文件/etc/udev/rules.d/,並為其提供了以下內容(到目前為止沒有什麼太具體的,只是想測試一下):

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

我保存了文件並插入 USB 驅動器進行測試。但是,該文件/tmp/test並未建立。

我認為我的 udev 規則應該與我的 USB 驅動器匹配,因為我可以udevadm info在 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不存在。我感到很困惑。顯然,這條規則正在被匹配並且規則正在被應用。那為什麼RUNexecute指定的指令沒有被執行呢?

答案1

您的規則必須給出可執行檔的絕對路徑:

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

編輯:

如果你想執行一個腳本,你必須告訴哪個 shell 會執行它:

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'

相關內容