Cron和rsync使用文件locking,但是在Mac OS X Server上有更好的方法吗?

我有这个bash脚本,并通过定期运行cron

#!/bin/bash RSYNC=/usr/bin/rsync SSH=/usr/bin/ssh KEY=/Users/admin/Documents/Backup/rsync-key RUSER=philosophy RHOST=example.com RPATH=data/ LPATH="/Volumes/G Technology G Speed eS/Backup" LOCKFILE=/Users/admin/Documents/backup.isrunning if [ ! -e $LOCKFILE ]; then touch $LOCKFILE $RSYNC -avz --delete --progress -e "$SSH -i $KEY" "$LPATH" $RUSER@$RHOST:$RPATH rm $LOCKFILE else echo "Rsync - Backup still running" fi 

备份可能会花费任何时间,从几分钟到几天,如果我通过cron每6小时运行备份,我不想要的是同时运行的两个实例。 所以我所做的就是创build一个简单的locking机制。 但我担心,如果脚本中途死亡的原因是locking文件总是在那里,备份程序不会运行。

有没有办法提高这个更好的傻瓜certificate?

谢谢

斯科特

编辑:最后bash脚本我现在使用感谢下面的答案:

 #!/bin/bash RSYNC=/usr/bin/rsync SSH=/usr/bin/ssh KEY=/Users/admin/Documents/Backup/rsync-key RUSER=philosophy RHOST=example.com RPATH=data/ LOCKFILE=/Users/admin/Documents/Backup/backup.isrunning if [ ! -e $LOCKFILE ] then echo $$ >"$LOCKFILE" else PID=$(cat "$LOCKFILE") if kill -0 "$PID" >&/dev/null then echo "Rsync - Backup still running" exit 0 else echo $$ >"$LOCKFILE" echo "Warning: previous backup appears to have not finished correctly" fi fi LPATH="/Volumes/G Technology G Speed eS/Backup" $RSYNC -avz --delete --progress -e "$SSH -i $KEY" "$LPATH" $RUSER@$RHOST:$RPATH LPATH="/Volumes/G Technology G Speed eS/Catalogue" $RSYNC -avz --delete --progress -e "$SSH -i $KEY" "$LPATH" $RUSER@$RHOST:$RPATH LPATH="/Volumes/G Technology G Speed eS/Digital" $RSYNC -avz --delete --progress -e "$SSH -i $KEY" "$LPATH" $RUSER@$RHOST:$RPATH LPATH="/Volumes/G Technology G Speed eS/Finance" $RSYNC -avz --delete --progress -e "$SSH -i $KEY" "$LPATH" $RUSER@$RHOST:$RPATH LPATH="/Volumes/G Technology G Speed eS/Image Libraries" $RSYNC -avz --delete --progress -e "$SSH -i $KEY" "$LPATH" $RUSER@$RHOST:$RPATH LPATH="/Volumes/G Technology G Speed eS/IT Desk" $RSYNC -avz --delete --progress -e "$SSH -i $KEY" "$LPATH" $RUSER@$RHOST:$RPATH LPATH="/Volumes/G Technology G Speed eS/Office" $RSYNC -avz --delete --progress -e "$SSH -i $KEY" "$LPATH" $RUSER@$RHOST:$RPATH LPATH="/Volumes/G Technology G Speed eS/Studio" $RSYNC -avz --delete --progress -e "$SSH -i $KEY" "$LPATH" $RUSER@$RHOST:$RPATH LPATH="/Volumes/G Technology G Speed eS/Toffee Apple" $RSYNC -avz --delete --progress -e "$SSH -i $KEY" "$LPATH" $RUSER@$RHOST:$RPATH rm -f "$LOCKFILE" 

如果将脚本的PID放入locking文件,那么如果新实例启动时存在locking文件,则可以读取PID并检查脚本是否仍在运行。 如果脚本没有运行,然后清理,将当前实例的PID放在locking文件中,然后启动rsync,否则打印一个“仍在运行”消息并退出。

编辑:

 #!/bin/bash backup() { RSYNC=/usr/bin/rsync SSH=/usr/bin/ssh KEY=/Users/admin/Documents/Backup/rsync-key RUSER=philosophy RHOST=example.com RPATH=data/ LPATH="/Volumes/G Technology G Speed eS/Backup" $RSYNC -avz --delete --progress -e "$SSH -i $KEY" "$LPATH" $RUSER@$RHOST:$RPATH } LOCKFILE=/Users/admin/Documents/backup.isrunning if [ ! -e "$LOCKFILE" ] then echo $$ >"$LOCKFILE" backup else PID=$(cat "$LOCKFILE") if kill -0 "$PID" >&/dev/null then echo "Rsync - Backup still running" exit 0 else echo $$ >"$LOCKFILE" echo "Warning: previous backup appears not to have finished correctly" backup fi fi rm -f "$LOCKFILE" 

如果你正在configuration多个备份,那么你可能想看看提供locking的LBackup ,并且完全支持备份。 有关备份备份优点的更多信息,请访问以下URL: http : //www.lbackup.org/network_backup_strategies

如果您检查LBackup源代码,您将看到如何使用陷阱实现locking系统。 上面关于使用PID的build议也是一个好主意。 采用这种方法,整个服务器应该会崩溃,陷阱也没有机会被激活。