You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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挂载相关命令的情况,导致命令执行失败。

修复步骤

  1. 把脚本内所有相对路径替换为绝对路径,私钥配置修改为:
AWS_PRIVATE_KEY = "/home/pi/backup/ARCS-Key-Pair-01.pem"
  1. 修改SSH命令参数,跳过主机指纹校验,避免连接被拦截:
sshaccess = 'ssh -i {private_key} -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null'.format(private_key=AWS_PRIVATE_KEY)
  1. 给所有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")
  1. 修改cron配置,把错误输出也写入日志,方便后续排查:
0 0 * * 0 sudo python3 /home/pi/backup/backupscript.py >> /home/pi/backup/backuplog 2>&1
  1. 先检查树莓派本地/mnt/nasper01目录下是否存在备份文件,如果存在说明之前挂载失败,数据写入了本地,把文件转移后再重新测试脚本。

内容的提问来源于stack exchange,提问作者BigL

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 05:06:01