我正在尝试自动执行无头系统的快速而肮脏的备份。 (我觉得需要注意的是,我正在运行 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") 运行脚本但无法安装驱动器。
答案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”子系统在“块”子系统之前触发,所以当脚本实际运行时我的符号链接不存在。