Udev

udev 觸發規則但腳本無法正確執行

  • April 15, 2014

我正在嘗試自動化無頭系統的快速而骯髒的備份。(我覺得有必要注意我正在執行 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.shshell 並安裝了驅動器) 通過 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”子系統之前觸發,所以當腳本實際執行時我的符號連結不存在.

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