我有一个 cron 作业,它运行一个 rsync 命令,每两小时执行一次远程备份。
如果之前的远程备份仍在运行,我已将此 rysnc 命令封装在 flock 命令中。
Flock 阻止此命令同时运行多次:
flock -n /location/of/lock_file -c 'rsync -rv /home/localuser/ [email protected]:/home/remoteuser/backupFolder' || echo "Couldn't perform remote backup, because previous remote backup is still in progress."
但是,如果我在其中一次备份期间重新启动远程服务器(以模拟连接中断的情况),flock 将继续阻止未来的尝试,因为先前的过程(尽管与备份目标永久断开连接)仍然存在。
让 flock 知道 rsync 已无限期失败,从而释放这些阻止未来尝试开始的锁的最佳方法是什么?
在 rsync 手册页上,我看到有一个 --timeout 参数。设置它是处理 flock 的全天候锁定的最佳方法吗?
答案1
这并不能回答您的问题,flock
但无论如何可能会有所帮助。不久前有一个关于备份策略的类似问题,我喜欢我的答案足以让我自己实现它。
基本思想是让备份脚本在完成时在备份目标上创建一个文件,并在开始运行时立即删除该文件。然后,让脚本测试文件是否存在,并且只有文件存在时才允许它运行:
#!/usr/bin/env bash
## Make sure no backup is currently running
if [ ! -e /path/to/backup/backup_finished.txt ]; then
echo "A backup seems to be running, or did not finish correctly, exiting." &&
exit;
fi
## Delete the file from the remote server
ssh user@remote rm /path/to/backup/backup_finished.txt
## Do da rsync
rsync /path/to/source/ user@remote:/path/to/daily/backup/
## Create the file on the remote server
ssh user@remote touch /path/to/backup/backup_finished.txt
这是一种比您的方法简单得多的方法,但它的优点是我可以捕获(尽管不能以任何优雅的方式处理)未完成的备份。您可以扩展它来测试备份是否正在运行,或者旧备份是否未干净地退出并做出相应的反应。
由于您需要监视本地和远程计算机上的进程,因此我认为锁定文件系统不会起作用。