我正在尝试使用这个 bash 脚本来创建并将 tar.gz 文件发送到我的备份服务器,但由于某种原因它似乎没有复制它,对于我正在尝试做的事情有没有更好的解决方案?
我宁愿在通过网络发送之前对其进行压缩
#!/bin/bash
####################################
#
# Backup to NFS mount script.
#
####################################
# What to backup.
backup_files="/home/amp/.ampdata/instances/Towny/"
# Where to backup to.
dest="/home/amp/Backups"
# Create archive filename.
day=$(date +%A)
time=$(date +%H-%M)
file=$(file)
archive_file="$file-$day-$time.tgz"
# Print start status message.
echo "Backing up $backup_files to $dest/$archive_file"
date
echo
# Backup the files using tar.
tar czf $dest/$archive_file $backup_files
rsync $archive_file [email protected]:~/backup
# Print end status message.
echo
echo "Backup finished"
date
答案1
脚本中任何地方你都可以引用$dest/$archive_file
你想要创建和复制的文件,除了在rsync
应该将其复制到另一台主机的命令中。修复调用rsync
并重试。
答案2
您需要向我们展示实际发生的事情,才能让您相信“它没有复制它”。
话虽如此,同时使用tar
和rsync
是不寻常的。rsync
通常会在文件树本身上使用,并且它只会复制需要复制的内容,同时考虑到已经存在的内容(仅发送差异)。
您不想这样做:您只想每次都发送这个 tar.gz 文件。所以我质疑使用 的意义rsync
。
你的脚本中的这一行是错误的:
file=$(file)
它正在执行命令file
并将输出放入名为 file 的变量中。它本身将是 stderr 上的错误输出,而不是 stdout 上的任何内容,因此$file
保持为空。为了取得进展,我假设此变量设置为字符串“file”。
一旦我们解析了变量的内容,您的脚本就会执行此操作:
tar czf /home/amp/Backups/file-Thursday-21-39 /home/amp/.ampdata/instances/Towny/
rsync file-Thursday-21-39 [email protected]:~/backup
因此,如上所述,您不需要同时使用tar
和rsync
。您正在使用tar
在本地存储档案,然后将其发送到远程主机。为什么要保留本地档案?您将如何防止它们填满您的本地存储?
您可以直接tar
通过 SSH 连接执行以下操作:
# tar zcvf - /home/amp/.ampdata/instances/Towny/ | \
ssh [email protected] 'cat > backup/file-Thursday-21-39.tar.gz'
其他一些评论:
- 我认为“Dayname-HH-MM”不是一种很好的格式。考虑一些更明显、更易于排序的格式,例如 YYYY-MM-DD-HHMMSS.tar.gz。
- 默认情况下,SSH 未压缩,但没关系,因为您的
tar
命令使用了 gzip 压缩。您可以考虑使用tar
其他压缩格式,如 XZ、bzip2、zstd 等。 - 完整的备份程序可以进行压缩、重复数据删除和可靠的备份。自己制作备份程序并不总是值得的。您可以考虑研究 borgbackup 或 restic 或类似程序。