我在这里检查过一个解决方案,但似乎找不到一个。我正在处理一个非常慢的WAN连接,大约300kb /秒。对于我的下载,我使用的是远程盒子,然后我将它们下载到我家。我正在尝试运行一个cronjob,它将每小时在我的远程和本地服务器上rsync两个目录。我得到了一切正常但如果有很多数据要传输rsyncs重叠并最终创建同一文件的两个实例,从而重复发送数据。
我想调用一个运行我的rsync命令的脚本,但只有在rsync没有运行的情况下?
答案 0 :(得分:79)
如前一个解决方案中所建议的那样创建“锁定”文件的问题是,如果负责删除它的脚本异常终止,则锁定文件可能已经存在。
例如,如果用户终止rsync进程,或者由于断电,就会发生这种情况。相反,应该使用flock
,这不会遇到这个问题。
碰巧flock也很容易使用,所以解决方案看起来就像这样:
flock -n lock_file -c "rsync ..."
只有在lock_file上没有其他进程锁定时,才会执行-c
选项后的命令。如果由于任何原因的锁定进程终止,则锁定将在lock_file上释放。 -n
选项表示flock应该是非阻塞的,所以如果有另一个进程锁定文件,则不会发生任何事情。
答案 1 :(得分:8)
通过脚本,您可以创建一个“锁定”文件。如果文件存在,则cronjob应跳过运行;否则它应该继续。脚本完成后,应删除锁定文件。
if [ -e /home/myhomedir/rsyncjob.lock ] then echo "Rsync job already running...exiting" exit fi touch /home/myhomedir/rsyncjob.lock #your code in here #delete lock file at end of your job rm /home/myhomedir/rsyncjob.lock
答案 2 :(得分:5)
不使用锁文件的简单解决方案就是这样做:
<table border="0" width="100%" height="100%" style="border-collapse:separate; position: fixed; top: 0; right: 0; left: 0;">
只要它是您在服务器上运行的唯一rsync作业,这将有效,然后您可以直接在cron中运行它,但您需要将输出重定向到日志文件。
如果您运行多个rsync作业,则可以使用以下模式将pgrep与完整命令行匹配:
pgrep rsync > /dev/null || rsync -avz ...
答案 3 :(得分:2)
要使用上面@User提供的锁定文件示例,应该使用陷阱来验证在出于任何原因退出脚本时是否删除了锁定文件。
if [ -e /home/myhomedir/rsyncjob.lock ]
then
echo "Rsync job already running...exiting"
exit
fi
touch /home/myhomedir/rsyncjob.lock
#delete lock file at end of your job
trap 'rm /home/myhomedir/rsyncjob.lock' EXIT
#your code in here
这样,即使脚本在脚本结束之前退出,锁文件也会被删除。
答案 4 :(得分:0)
作为一种确定的解决方案,请在crontab中启动新的rsync进程之前先将其关闭。