我在这里检查过一个解决方案,但似乎找不到一个.我正在处理一个非常慢的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方案称,羊群应该是非阻塞的,所以如果有另一个进程锁定的文件什么都不会发生.
通过脚本,您可以创建一个"锁定"文件.如果文件存在,则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)
这样,即使脚本在脚本结束之前退出,锁定文件也会被删除。
不使用锁文件的简单解决方案就是这样做:
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)