Answers:
您可以实现某种锁定。这将打印仍在运行的rsync进程数:
pgrep -cx rsync
并且只有在不存在其他rsync进程的情况下,此命令才会运行rsync:
pgrep -cx rsync || rsync ...
使用-x
可以防止意外匹配不需要的名称(例如“ fooba rsync hronizator”或“ not_an_ rsync _totally”-就像pgrep -c ^rsync$
)
您可以使用flock命令来帮助您完成此操作,例如,在这种情况下flock -n
,可能就是您想要的,因为如果无法获得锁定,它将导致命令立即失败,例如
30 * * * * /usr/bin/flock -n /tmp/myRsyncJob.lck /path/to/your/rsyncScript
/var/run
。
如果您愿意考虑使用其他工具,也可以看看rdiff-backup。它使用librsync进行备份,并保存可配置数量的增量/增量。它还会锁定,以便在任何给定时间只能运行一个rdiff-backup进程。
这就是我要做的。在rsync周围创建一个包装器脚本,以创建一个锁定文件。
script 1
- create lock file
- rsync
- remove lock file
script 2 (running later then script 1)
- check if lock file is there
- if not run
- if it is there wait 10 minutes in a loop. break out of lopp when the lock file is gone
- continue to run script
我的答案与迈克说的有些相同。
在脚本中,您应该输入以下内容:
但是,您应该做的一件非常重要的事情。并实施陷阱系统。
因此,您可以做的是,即使您的脚本被某种方式杀死或有人杀死了它,您也可以捕获该信号并删除锁定文件,从而没有陈旧的锁定文件。
您可以在此处阅读如何实现该功能。
一件小事,您就无法捕获信号9,我的意思是,如果有人这样做kill -9
,您就无法捕获信号,因为该信号直接与内核交互,因此无法捕获它。
另外,按照John的建议,每次系统重新启动时,都需要删除锁定文件,只是要确保没有剩余的过时文件。
您可以通过rm -f <FILE>
在/etc/rc.local中放置一个小命令来轻松实现
使用-s(序列化)开关查看anacron(过时的cron)。序列化可确保如果前一个命令仍在运行,则不会再次调用该命令。