【问题标题】:Automated Backups from EC2 to NAS using Rsync使用 Rsync 从 EC2 自动备份到 NAS
【发布时间】:2021-11-17 11:38:11
【问题描述】:

我正在尝试使用带有 python 脚本的 raspberry pi 自动备份,该脚本会将相应备份目录中 EC2 实例 CAMSTEST1 和 CAMSProd 上的所有内容同步到本地 NAS。

听到的是剧本

#!/usr/bin/python3
import subprocess
from os import path

# private key for AWS Servers
AWS_PRIVATE_KEY = "ARCS-Key-Pair-01.pem"
AWS_USER ="ubuntu"

# NAS backup directory
NAS_BACKUP_DIR = "192.168.1.128:/test"
NAS_MNT = "/mnt/nasper01/"

# CAMSTest1 Config
CAMSTEST1_USER = "ubuntu"
CAMSTEST1_IP = "52.62.119.203"
CAMSTEST1_DIR = "/mnt/backups/*"
CAMSTEST1_MNT = NAS_MNT + "camstest"

#CAMSProd Config
CAMSPROD_USER = "ubuntu"
CAMSPROD_IP = "54.206.28.116"
CAMSPROD_DIR = "/mnt/backups/*"
CAMSPROD_MNT = NAS_MNT + "camsprod"

# mount NAS
print("Mounting NAS")
subprocess.call(["mount","-t", "nfs", NAS_BACKUP_DIR, NAS_MNT])
print("NAS Mounted Successfully")
    
# backup CAMSTEST1
print("Backing Up CAMSTest1")
hostnamefs = "{user}@{ip}:{dir}".format(user=CAMSTEST1_USER,ip=CAMSTEST1_IP,dir=CAMSTEST1_DIR)
sshaccess = 'ssh -i {private_key}'.format(private_key=AWS_PRIVATE_KEY)
subprocess.call(["rsync","-P","-v","--rsync-path","sudo rsync","--remove-source-files","--recursive","-z","-e",sshaccess,"--exclude","/backup-script",hostnamefs, CAMSTEST1_MNT ])
print("Backed Up CAMSTest1 Successfully")

#backup CAMSPROD
print("Backing Up CAMSProd")
hostnamefs = "{user}@{ip}:{dir}".format(user=CAMSPROD_USER,ip=CAMSPROD_IP,dir=CAMSPROD_DIR)
sshaccess = 'ssh -i {private_key}'.format(private_key=AWS_PRIVATE_KEY)
subprocess.call(["rsync","-P","-v","--rsync-path", "sudo rsync","--remove-source-files","--recursive","-z","-e",sshaccess,"--exclude","/backup-script","--exclude","/influxdb-backup", "--exclude", "/db-backup-only",hostnamefs, CAMSPROD_MNT ])
print("Backed Up CAMSProd Successfully")

听到的是 cronjob

0 0 * * 0 sudo python3 /home/pi/backup/backupscript.py >> /home/pi/backup/backuplog

当从终端手动运行时,该脚本可以完美运行。但是它不适用于 cronjob。它运行没有错误,但没有任何内容从 ec2 实例复制到 NAS。谁能解释为什么它不能使用 cronjob 而是在终端中工作?

编辑

这是没有错误的备份脚本日志的输出

Last RunTime:
2021-10-31 00:00:02.191447
Mounting NAS
NAS Mounted Successfully
Backing Up ARCSWeb02
Backed up ARCWeb02 Successfully
Backing Up CAMSTest1
Backed Up CAMSTest1 Successfully
Backing Up CAMSProd
Backed Up CAMSProd Successfully
Fetching origin
Last RunTime:
2021-11-07 00:00:02.264703
Mounting NAS
NAS Mounted Successfully
Backing Up ARCSWeb02
Backed up ARCWeb02 Successfully
Backing Up CAMSTest1
Backed Up CAMSTest1 Successfully
Backing Up CAMSProd
Backed Up CAMSProd Successfully

【问题讨论】:

  • 什么不起作用?你有错误吗?
  • @luigigi 我已经从脚本中附加了日志并且没有错误存在

标签: python cron raspberry-pi backup rsync


【解决方案1】:

我建议通过使用crontab -e 编辑 cron 文件,或通过添加具有 root 权限的文件(或其他用户可以直接执行脚本)在作业定义中指定到/etc/cron.d/,无需指定sudo关键字

这里有一些关于这个问题的参考资料:

【讨论】:

  • 我将 cronjob 放在根 crontab 文件中并删除 sudo。但同样的结果。
  • 在浏览了你的脚本之后,我注意到在子进程调用中,你还从程序内部调用 rsync 作为 sudo,这也可能很麻烦。
【解决方案2】:

当您在子进程中运行rsync 时,它会从非交互式shell 中选择一个不同的$PATH;因此,rsync 可能不在其路径中。尝试在子进程调用中使用rsync 的完整路径。

【讨论】:

  • 脚本已经可以工作,所以我认为问题在于在 cronjob 中运行它
  • @sharad-gor OP 说脚本在交互式 shell 中工作。这与非交互式 shell 不同,这是在 cron 作业中使用子进程调用时发生的情况。
【解决方案3】:

我有一些建议,

  1. 如前所述,对 root 用户使用 cronjob(无 sudo)
  2. 从 cronjob 中删除 python3,改为使用 `chmod +x ' 使您的脚本可执行并运行它
0 0 * * 0 /home/pi/backup/backupscript.py >> /home/pi/backup/backuplog
  1. 只是一个建议,我觉得 shell 脚本在这里会更合适,而不是 python

【讨论】:

    猜你喜欢
    • 2017-10-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-20
    • 1970-01-01
    • 2015-06-29
    • 1970-01-01
    • 2018-07-25
    相关资源
    最近更新 更多