我有一个简单的 udev 规则来匹配 USB 存储设备,该规则运行一个简单的脚本来查找 USB 中的文件。我使用该usbmount
包来自动安装 USB。正如文档所述,USB 设备将安装到/media/usb{0..7}
。
当检测到 USB 存储设备时,我运行此脚本
#!/bin/bash
options=("usb0" "usb1" "usb2" "usb3" "usb4" "usb5" "usb6" "usb7")
for dir in "${options[@]}"
do
lookup="/media/$dir/luah_v2_version.zip"
if [ -e "$lookup" ]; then
cp $lookup /home/luah
exit 0
else
echo "could not find $lookup" >> /home/luah/log
fi
done
问题是,当 USB 连接后自动运行脚本时,它会导致一个日志文件,其中显示无法在上述任何目录中找到该文件(尽管它确实存在)。当我手动运行脚本时,它会运行并将 zip 文件复制到我想要的位置。
我尝试在脚本执行前设置 10 秒的等待时间,以查看脚本运行时 USB 是否尚未安装,但我得到的最终结果相同。
答案1
可能在处理规则时 usb 尚未挂载。尝试向 usbmount 添加一个钩子,即创建一个名为/etc/usbmount/mount.d/10_autocopy.sh
#!/bin/sh
[ -f $UM_MOUNTPOINT/luah_v2_version.zip ] && cp $UM_MOUNTPOINT/luah_v2_version.zip /home/luah
然后使其可执行:
chmod +x /etc/usbmount/mount.d/10_autocopy.sh
为挂载脚本(/etc/usb/mount.d)设置的变量:
- UM_DEVICE:已安装的设备
- UM_MOUNTPOINT:设备的挂载点
- UM_FILESYSTEM:文件系统类型
- UM_MOUNTOPTIONS:挂载选项
- UM_VENDOR:设备的供应商字符串
- UM_MODEL:型号或产品字符串
为卸载脚本设置的变量(/etc/usb/umount.d):
- UM_DEVICE:已安装的设备
- UM_MOUNTPOINT:设备的挂载点
- UM_FILESYSTEM:文件系统类型
笔记:
- 所有脚本默认以 root 用户身份执行。
- 如果 VERBOSE=yes,usbmount 将使用 syslog 工具 -/etc/usbmount/usbmount.conf