Linux Shell脚本检测挂载并备份文档执行异常排查
Shell脚本备份问题排查与修正
错误点汇总
- 变量名拼写错误:你提前定义的备份目标路径变量为
docsbackup,但调用sync_files函数时误写为docksbackup,多了字母k,导致rsync接收的目标参数为空,执行逻辑完全不符合预期。 - 挂载检测逻辑错误:你当前检测的挂载点是
/run/media/user1,这个是系统默认的移动介质挂载父目录,本身默认就处于挂载状态,会导致判断永远走「已挂载」分支;且你计划挂载的/dev/sdc3实际对应挂载点应该是/run/media/user1/linux_backup而非上层父目录,挂载逻辑也匹配错误。 - 权限缺失:普通用户执行
mount挂载块设备需要root权限,你脚本里的mount $filesystem $mount没有加sudo,执行时会直接报错权限不足。 - 变量引用不规范:所有变量引用都没有加双引号,若路径中存在空格、特殊字符时,会导致参数被错误拆分,命令执行失败。
- 退出状态码不规范:awk脚本中返回
exit -1不符合shell脚本的状态码规范,shell中错误状态码范围为1-255,返回-1会被自动转换为255,虽然不影响当前判断但存在潜在兼容问题。
修正后的完整脚本
#!/bin/bash # 检测linux_backup文件系统是否已挂载 # 未挂载则先挂载再执行文档备份 docs="/home/user1/Documents" # 修正为备份盘实际对应的挂载点 mount_point="/run/media/user1/linux_backup" docsbackup="${mount_point}/home/user1/Documents" filesystem="/dev/sdc3" sync_files() { local SOURCE="$1" local TARGET="$2" # 提前创建目标目录避免rsync路径错误 sudo mkdir -p "$TARGET" sudo rsync --progress -r --update -aAXv "$SOURCE"/ "$TARGET"/ } # 用findmnt检测挂载点比解析mount输出更稳定 if findmnt --mountpoint "$mount_point" >/dev/null 2>&1; then echo "linux_backup已挂载,开始备份" sync_files "$docs" "$docsbackup" else echo "linux_backup未挂载,先执行挂载操作" # 提权挂载,提前创建挂载点目录 sudo mkdir -p "$mount_point" sudo mount "$filesystem" "$mount_point" # 挂载成功校验,避免挂载失败仍然执行备份 if [ $? -ne 0 ]; then echo "挂载失败,退出备份流程" exit 1 fi sync_files "$docs" "$docsbackup" fi
补充说明
- rsync的源路径末尾加
/表示同步目录内的内容,而非把整个源目录复制到目标路径下,避免出现嵌套目录的问题 - 新增了挂载成功判断逻辑,避免挂载失败后备份文件写入本地磁盘占用空间
内容的提问来源于stack exchange,提问作者Python_plusSharp
相关产品推荐
相关产品推荐

