Sco*_*ott 6 files rsync mac-osx cron
我有这个 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
Run Code Online (Sandbox Code Playgroud)
备份可能需要任何时间,从几分钟到几天不等,如果我每 6 小时通过 cron 运行一次备份,我不想要的是同时运行的两个实例。所以我所做的是创建了一个简单的锁定机制。但我担心如果脚本中途终止,无论出于何种原因,锁定文件总是会在那里并且备份例程不会运行。
有没有办法增强它以更好地防呆?
谢谢
斯科特
编辑: 由于以下答案,我现在正在使用的最终 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"
Run Code Online (Sandbox Code Playgroud)
如果将脚本的PID放入锁定文件中,那么在新实例启动时如果锁定文件存在,则可以读取PID并检查脚本是否仍在运行。如果脚本没有运行,则进行清理,将当前实例的 PID 放入锁定文件中并启动 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"
Run Code Online (Sandbox Code Playgroud)