EC2通过Rsync备份到NAS时cronjob执行无同步效果问题咨询
问题原因与解决方案
常见故障根因
- 相对路径读取失败:脚本内AWS私钥使用的是相对路径
ARCS-Key-Pair-01.pem,cron执行脚本时默认工作目录为执行用户(此处为root)的家目录,而非你手动运行脚本时的/home/pi/backup目录,导致脚本找不到SSH私钥,无法连接EC2实例。 - 错误日志未捕获:你当前的日志仅捕获了脚本自行打印的标准输出,
subprocess.call执行命令的错误输出没有写入日志,同时你没有对命令执行的返回码做判断,哪怕rsync、mount执行失败,脚本依然会打印“成功”提示,无法感知实际故障。 - SSH主机校验拦截:cron以root身份执行时,root用户的
~/.ssh/known_hosts文件中没有提前录入EC2实例的主机指纹,SSH连接时会静默等待用户确认,导致连接直接中断,rsync同步失败。 - NAS挂载异常:脚本每次运行都会直接执行mount操作,如果/mnt/nasper01目录已被占用、或者之前挂载失败未清理,实际数据会写入树莓派本地的
/mnt/nasper01目录,而非远程NAS,你在NAS侧自然看不到同步的文件。 - 环境变量缺失:cron的PATH环境变量比终端登录场景下少很多,可能出现找不到rsync、nfs挂载相关命令的情况,导致命令执行失败。
修复步骤
- 把脚本内所有相对路径替换为绝对路径,私钥配置修改为:
AWS_PRIVATE_KEY = "/home/pi/backup/ARCS-Key-Pair-01.pem"
- 修改SSH命令参数,跳过主机指纹校验,避免连接被拦截:
sshaccess = 'ssh -i {private_key} -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null'.format(private_key=AWS_PRIVATE_KEY)
- 给所有subprocess调用增加返回码判断,避免假成功:
# 以挂载NAS为例,其他命令同理修改 mount_ret = subprocess.call(["mount","-t", "nfs", NAS_BACKUP_DIR, NAS_MNT]) if mount_ret != 0: print("NAS挂载失败,错误码:", mount_ret) exit(1) print("NAS Mounted Successfully")
- 修改cron配置,把错误输出也写入日志,方便后续排查:
0 0 * * 0 sudo python3 /home/pi/backup/backupscript.py >> /home/pi/backup/backuplog 2>&1
- 先检查树莓派本地
/mnt/nasper01目录下是否存在备份文件,如果存在说明之前挂载失败,数据写入了本地,把文件转移后再重新测试脚本。
内容的提问来源于stack exchange,提问作者BigL
相关产品推荐
相关产品推荐

