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.shshell 并安装驱动器) 由 udev 规则运行时的脚本 (RUN+="/usr/local/bin/backup.sh") 运行脚本但无法安装驱动器。

答案1

我最终解决了这个问题。

我认为问题与这一切的时机有关。

我将 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”子系统在“块”子系统之前触发,所以当脚本实际运行时我的符号链接不存在。

相关内容