首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >仅当Rsync尚未运行时才会运行的rsync cronjob

仅当Rsync尚未运行时才会运行的rsync cronjob
EN

Stack Overflow用户
提问于 2012-02-22 14:30:43
回答 4查看 20.7K关注 0票数 22

我已经在这里寻找了解决方案,但似乎找不到一个。我正在处理一个非常慢的wan连接,大约是300kb/秒。对于我的下载,我使用一个远程盒子,然后我将它们下载到我的家里。我正在尝试运行一个cronjob,它将每小时同步我的远程和本地服务器上的两个目录。我让一切正常工作,但如果有大量数据要传输,rsync会重叠,最终会创建同一文件的两个实例,从而发送重复的数据。

我想要调用一个脚本来运行我的rsync命令,但是只有在rsync没有运行的情况下?

EN

回答 4

Stack Overflow用户

发布于 2012-04-02 20:59:01

在前面的解决方案中创建" lock“文件的问题是,如果负责删除锁文件的脚本异常终止,则锁文件可能已经存在。例如,如果用户终止rsync进程,或者由于断电,则可能发生这种情况。相反,人们应该使用flock,它不会受到这个问题的影响。

碰巧flock也很容易使用,所以解决方案看起来就像这样:

flock -n lock_file -c "rsync ..."

仅当lock_file上没有其他进程锁定时,才会执行-c选项后的命令。如果锁定过程由于任何原因而终止,锁定将在lock_file上释放。-n选项说明flock应该是非阻塞的,因此如果有其他进程锁定文件,则不会发生任何事情。

票数 97
EN

Stack Overflow用户

发布于 2016-05-22 00:40:30

要使用上面的@User给出的锁文件示例,应使用陷阱来验证在出于任何原因退出脚本时是否删除了锁文件。

代码语言:javascript
复制
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

这样,即使脚本在脚本结束前退出,锁文件也会被删除。

票数 7
EN

Stack Overflow用户

发布于 2015-08-10 16:29:31

一个不使用锁文件的简单解决方案是这样做:

代码语言:javascript
复制
pgrep rsync > /dev/null || rsync -avz ...

只要它是您在服务器上运行的唯一rsync作业,它就可以工作,然后您可以直接在cron中运行它,但是您需要将输出重定向到日志文件。

如果您确实运行了多个rsync作业,则可以使用如下模式让pgrep与整个命令行进行匹配:

代码语言:javascript
复制
pgrep -f rsync.*/data > /dev/null || rsync -avz --delete /data/ otherhost:/data/
pgrep -f rsync.*/www  > /dev/null || rsync -avz --delete /var/www/ otherhost:/var/www/
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9390134

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档