
我正在運行 RHEL6,並且正在嘗試編寫一個在插入和移除 USB 裝置時觸發的 udev 規則。我創建了一個名為80-usb.rules
in 的文件/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
不存在。我感到很困惑。顯然,這條規則正在被匹配並且規則正在被應用。那為什麼RUN
execute指定的指令沒有被執行呢?
答案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'