Linux
在插入設備的情況下啟動電腦時為 USB 快閃記憶體驅動器執行 udev 規則
我希望我的 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 單元並在腳本中聲明您需要的依賴項。您仍然需要注意潛在的競爭條件。