我有以下脚本rsync
用于备份和同步我的文件。
我怎样才能使这个脚本更紧凑、更快并且具有更好的错误处理能力?
#!/bin/sh
errors=""
sudo rsync -avh --delete --no-o --no-g /home/xralf/audio /media/extdevice/rsync_backups/
if [ "$?" -eq "0" ]
then
echo "no errors in audio"
else
errors="${errors}error in audio\n"
fi
sudo rsync -avh --delete --no-o --no-g /home/xralf/books /media/extdevice/rsync_backups/
if [ "$?" -eq "0" ]
then
echo "no errors in books"
else
errors="${errors}error in books\n"
fi
sudo rsync -avh --delete --no-o --no-g /home/xralf/source_code /media/extdevice/rsync_backups/
if [ "$?" -eq "0" ]
then
echo "no errors in source_code"
else
errors="${errors}error in source_code\n"
fi
# more such directories with this code pattern
echo ${errors}
后来我打算不看脚本执行,所以我只想看到结果并相信一切顺利。我运行了脚本,但最后,我拥有的唯一信息是error in source_code
,我看不到究竟是什么错误(是哪个文件导致的)。
如果您不是被迫使用
sh
但可以使用更复杂的 shell,例如bash
,您可以执行以下操作:您可能还想捕获 stderr ,但这与您的脚本做同样的事情。
如果您的优先级是紧凑和快速(即:最小化进程数量,但在这种情况下,您受到磁盘 IO 的限制,而不是 CPU 或内存):
删除该
-v
选项将使输出噪音更小,以便您可以专注于显式错误(如果有)。将1>&2
STDOUT 重定向到 STDERR,以便将错误消息发送到预期的位置。如果在无人值守的情况下运行,则以下替代方案可能比内置的更好echo
,但代价是额外的进程:服务器可以
logger
用来将消息发送到以syslog
进行集中处理。确切的语法将取决于服务器配置。用于
date
添加计时信息,脚本的最后一行变为:一些它会输出类似的东西
[2022/11/05 14:37:27] rsync completed successfully
该
rsync
命令接受参数--log-file=FILE
。备份完成后,您可以检查它是否有错误。为了效率,它也接受
--exclude-from=FILE
and--include-from=FILE
。您可以创建包含您所做和不想备份的所有内容的列表的文本文件,并从单个rsync
命令而不是多个命令调用它们。请参阅
man rsync
或联机手册页。创建一个名为module.sh的文件并为其提供以下文本:
然后你制作另一个文件并从那里获取模块:
注意不同的 Shebang,这个是 POSIX 兼容的。
我还添加了 Rsync 的 -z 选项。它压缩途中的数据。