2012-02-22 135 views
17

我已经在此处检查了一个解决方案,但似乎找不到一个解决方案。我正在处理大约300kb /秒的非常慢的连接。对于我的下载,我正在使用一个遥控盒,然后我将它们下载到我的房子。我试图运行一个cronjob,它会每隔一小时在远程和本地服务器上rsync两个目录。我得到了一切工作,但如果有大量的数据传输rsyncs重叠,并最终创建相同文件的两个实例,从而发送重复数据。Rsync cronjob只会在rsync尚未运行的情况下运行

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

+0

下面是一个关于单个shell脚本实例的类似答案,但它需要您选择的答案并使其更加健壮。 http://stackoverflow.com/questions/185451/quick-and-dirty-way-to-ensure-only-one-instance-of-a-shell-script-is-running-at – physicsmichael 2013-02-27 02:07:05

回答

7

通过脚本您可以创建一个“锁定”文件。如果文件存在,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 
+0

好吧,我真的很新整个脚本的东西,发现这个:'code'if(set -o noclobber; echo“locked”>“$ lockfile”)2>/dev/null;然后 trap'rm -f“$ lockfile”;退出$?“INT TERM EXIT 回声 ”锁定成功“>&2 RM -f ”$文件锁“ 其他 回声 ”锁失败 - 退出“>&2 出口1个 网络连接'\ code' – mfpockets 2012-02-22 06:55:06

+0

它并不需要是复杂。只需创建一个锁文件。如果使用-e来检查文件的存在并且它存在退出;否则继续。 – bubbly 2012-02-22 06:59:41

+0

谢谢,这将有助于我能弄清楚如何正确地锁定文件。 :(对一个新手没有帮助 – mfpockets 2012-02-22 15:03:24

73

与创建一个“锁定”文件在以前的解决方案提出的问题是,锁定文件可能已经存在,如果负责删除它的脚本异常终止。 例如,如果用户终止rsync进程或由于停电,可能会发生这种情况。相反,应该使用flock,它不会遇到这个问题。

碰巧的羊群也很容易使用,因此该解决方案只会是这样的:

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

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

+1

这是绝对正确的。另一种解决方案是使用租约,而不是锁,以便锁定在一段时间后超时,除非续租。租约基本上是一个带有时间戳的锁文件。 – cha0site 2012-04-02 19:17:22

+6

工作完美。这应该是被接受的答案。 – chovy 2013-07-09 01:17:14

+1

需要注意的是,这在NFS – WarmWaffles 2013-10-19 05:52:56

4

,而无需使用锁文件,一个简单的解决方法就是做:

pgrep rsync > /dev/null || rsync -avz ... 

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

如果你运行多个rsync的工作,你可以得到p纤ep来匹配完整的命令行,像这样的模式:

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/ 
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 

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

+0

这实际上是最好的解决方案 – berezovskyi 2017-04-30 10:45:11

相关问题