Linux

在插入設備的情況下啟動電腦時為 USB 快閃記憶體驅動器執行 udev 規則

  • September 28, 2015

我希望我的 Ubuntu 15.04 x64 伺服器系統在插入某個快閃記憶體驅動器時執行腳本。所以我創建了一個自定義規則文件,內容如下

ACTION=="add",SUBSYSTEM=="usb",ATTR{idVendor}=="my-vendor",ATTR{idProduct}=="my-id",RUN+="/var/scripts/my-script.sh"

插入快閃記憶體驅動器時執行的腳本,但我有兩個問題:

1)當電腦在已插入驅動器的情況下(重新)啟動時,腳本顯然沒有執行。如果快閃記憶體驅動器已經連接,有什麼方法可以在啟動後執行腳本?

2)腳本想要掛載設備,但是如果我嘗試像這樣掛載設備

mount LABEL=mylabel /some/path

或者

mount UUID=my-uuid /some/path

找不到來源。目前我插入了一個

sleep 5s

進入我的腳本,但這似乎不是一個可靠的解決方案。是否有任何(容錯)方法來等待系統充分初始化?

出於測試目的,腳本僅包含

#!/bin/sh
date >> /tmp/test.log

add如果設備存在,則在系統啟動期間執行操作規則。這是通過udevadm info --action=add在 SysVinit 系統上執行並在內部在 Upstart 或 Systemd 系統上執行來完成的。然而,這發生在啟動過程的早期,此時根文件系統仍以只讀方式掛載,而其中的文件系統/etc/fstab尚未掛載。我不確定/run當時是否已經可用。對於您的腳本需要做的事情來說,這可能還為時過早。

在啟動期間執行腳本的快速而簡單但可移植的方法是從 執行它/etc/rc.local,有條件地取決於存在的設備。

if [ -e /dev/disk/by-id/… ]; then
 /var/scripts/my-script.sh
fi

請注意,如果在啟動期間插入設備,可能會出現競爭條件:一旦檢測到設備,腳本將立即執行,然後再次從/etc/rc.local.

更簡潔的解決方案是定義一個 systemd 單元並在腳本中聲明您需要的依賴項。您仍然需要注意潛在的競爭條件。

引用自:https://unix.stackexchange.com/questions/232314