Udev
udev 觸發規則但腳本無法正確執行
我正在嘗試自動化無頭系統的快速而骯髒的備份。(我覺得有必要注意我正在執行 Busybox 實用程序,所以這是我可以使用的掛載工具)我已經制定了一個 udev 規則來在插入我的 USB 設備並且它確實觸發並執行腳本時執行稱為腳本。
目前腳本只是掛載設備,但它沒有這樣做。如果我手動執行腳本,則沒有錯誤。我添加了這條線
exec >/home/user/udev.out 2>&1
以試圖找出它失敗的原因。腳本內容:
#!/bin/sh exec >/home/user/udev.out 2>&1 mount -t ntfs-3g /dev/sdb1 /mnt/backup exit 0
我知道我不應該在腳本中使用 /dev/sdb1,並且我確實在 udev 規則中生成了一個符號連結,但只是為了檢查錯誤,我已經對設備進行了硬編碼。
我還嘗試在掛載命令之前添加 3 秒睡眠,以確保在執行掛載命令之前系統可以檢測到設備,但無濟於事。
udev.out 的結果:
mount: mounting /dev/sdb1 on /mnt/backup failed: No such device
我知道該設備在那裡,它由 fdisk 列出。如果我從 shell 呼叫腳本,它執行成功沒問題。
有沒有人遇到過類似的事情?我不確定如何進行。
編輯:udev 規則:
SUBSYSTEM=="block", ATTRS{serial}=="serialforusbdrive", SYMLINK+="kingston%n" SUBSYSTEM=="usb", ATTRS{serial}=="serialforusbdrive", RUN+="/usr/local/bin/backup.sh"
編輯:澄清:udev 規則觸發並執行我的腳本。從 shell 手動執行時的腳本(我輸入
/usr/local/bin/backup.sh
shell 並安裝了驅動器) 通過 udev 規則執行的腳本(RUN+="/usr/local/bin/backup.sh")執行腳本但無法安裝驅動器.
我最終解決了這個問題。
我認為,問題與這一切的時間安排有關。
我將 udev 規則更改為都在同一個子系統上
SUBSYSTEM=="block", ATTRS{serial}=="serialforusbdrive", SYMLINK+="kingston%n" SUBSYSTEM=="block", ATTRS{serial}=="serialforusbdrive", RUN+="/usr/local/bin/backup.sh"
然後將以下行添加到腳本的開頭。
sleep 5 stat /dev/kingston1
我認為整個事情的時間有點不對,它會在磁碟準備好之前嘗試掛載,並且“usb”子系統在“block”子系統之前觸發,所以當腳本實際執行時我的符號連結不存在.