只有在rsync尚未运行时才会运行的Rsync cronjob

mfp*_*ets 20 cron rsync

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

我想改为调用一个运行我的rsync命令的脚本,但仅当rsync没有运行时?

J. *_*sen 83

如先前解决方案中所建议的那样创建"锁定"文件的问题在于,如果负责移除它的脚本异常终止,则锁定文件可能已经存在.例如,如果用户终止rsync进程,或者由于断电,就会发生这种情况.相反,人们应该使用flock,而不会遇到这个问题.

因为它发生了flock也很容易使用,所以解决方案看起来像这样:

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

-c只有在lock_file上没有其他进程锁定时,才会执行该选项后的命令.如果由于任何原因的锁定进程终止,则锁定将在lock_file上释放.该-n方案称,羊群应该是非阻塞的,所以如果有另一个进程锁定的文件什么都不会发生.

  • 工作得很完美.这应该是公认的答案. (6认同)

sou*_*ser 9

通过脚本,您可以创建一个"锁定"文件.如果文件存在,则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


小智 7

要使用上面@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
Run Code Online (Sandbox Code Playgroud)

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


dan*_*nyw 5

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

pgrep rsync > /dev/null || rsync -avz ...
Run Code Online (Sandbox Code Playgroud)

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

如果您运行多个rsync作业,则可以使用以下模式将pgrep与完整命令行匹配:

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/
Run Code Online (Sandbox Code Playgroud)