我已经在这里寻找了解决方案,但似乎找不到一个。我正在处理一个非常慢的wan连接,大约是300kb/秒。对于我的下载,我使用一个远程盒子,然后我将它们下载到我的家里。我正在尝试运行一个cronjob,它将每小时同步我的远程和本地服务器上的两个目录。我让一切正常工作,但如果有大量数据要传输,rsync会重叠,最终会创建同一文件的两个实例,从而发送重复的数据。
我想要调用一个脚本来运行我的rsync命令,但是只有在rsync没有运行的情况下?
发布于 2012-04-02 20:59:01
在前面的解决方案中创建" lock“文件的问题是,如果负责删除锁文件的脚本异常终止,则锁文件可能已经存在。例如,如果用户终止rsync进程,或者由于断电,则可能发生这种情况。相反,人们应该使用flock
,它不会受到这个问题的影响。
碰巧flock也很容易使用,所以解决方案看起来就像这样:
flock -n lock_file -c "rsync ..."
仅当lock_file上没有其他进程锁定时,才会执行-c
选项后的命令。如果锁定过程由于任何原因而终止,锁定将在lock_file上释放。-n
选项说明flock应该是非阻塞的,因此如果有其他进程锁定文件,则不会发生任何事情。
发布于 2016-05-22 00:40:30
要使用上面的@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
这样,即使脚本在脚本结束前退出,锁文件也会被删除。
发布于 2015-08-10 16:29:31
一个不使用锁文件的简单解决方案是这样做:
pgrep rsync > /dev/null || rsync -avz ...
只要它是您在服务器上运行的唯一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/
https://stackoverflow.com/questions/9390134
复制相似问题