如何通过命令行工具确认外接USB磁盘的就绪状态以整合到挂载脚本中
如何通过命令行工具确认外接USB磁盘的就绪状态以整合到挂载脚本中
我太懂你这种靠摸硬盘振动判断就绪的操作了——虽然接地气,但脚本里总不能让程序“摸硬盘”对吧?别担心,有几个实用的命令行工具能帮你自动检测外接USB硬盘的就绪状态,完美替代手动摸振动的步骤,轻松整合到挂载脚本里。
1. 用 udevadm settle 等系统完成设备初始化
Linux的udev系统会负责处理外接设备的识别、驱动加载甚至自动fsck这类操作,udevadm settle 就是专门用来等待所有pending的udev事件处理完成的工具。你只需要在脚本里插电后加上这一行:
# 等待系统完成磁盘的初始化、fsck等操作,超时设为60秒可按需调整 udevadm settle --timeout=60
这个命令会一直等到udev把磁盘相关的所有操作都处理完才返回,相当于替你“等振动停下来”,非常适合脚本里的前置检查。
2. 用 blkid + lsblk 循环检查分区就绪状态
如果需要更精准地确认某个特定分区是否就绪(比如你的MyBook有多个分区),可以结合blkid(识别分区UUID)和lsblk(查看设备状态)写个循环检查逻辑,比如:
#!/bin/bash # 替换成你目标分区的UUID(用blkid命令可以查到) TARGET_UUID="xxxx-xxxx" # 最长等待时间,单位秒 MAX_WAIT=60 WAIT_COUNT=0 while true; do # 通过UUID查找对应的设备路径 DEVICE=$(blkid -U "$TARGET_UUID") if [ -n "$DEVICE" ]; then # 获取磁盘主设备(比如/dev/sdb1对应/dev/sdb)并检查状态 DISK_DEV=$(echo "$DEVICE" | sed 's/[0-9]*$//') STATE=$(lsblk -d "$DISK_DEV" --noheadings --output STATE) if [ "$STATE" = "running" ]; then echo "目标分区已就绪,开始挂载..." mount "$DEVICE" /mnt/your-backup-point break fi fi # 超时判断 WAIT_COUNT=$((WAIT_COUNT + 1)) if [ "$WAIT_COUNT" -ge "$MAX_WAIT" ]; then echo "超时警告:磁盘未在${MAX_WAIT}秒内就绪" exit 1 fi sleep 1 done
用UUID而不是/dev/sdbX这种设备名的好处是,不管USB磁盘每次识别成哪个设备号,都能精准定位到你的目标分区,避免挂载错误。
小提示
- 如果你不确定自己磁盘的UUID,直接运行
blkid命令就能看到所有已识别分区的UUID信息。 - 可以把
udevadm settle和循环检查结合起来,先让系统完成初始化,再精准检查分区,双重保障更可靠。
备注:内容来源于stack exchange,提问作者Eric Marceau




