Mac-Osx
使用文件鎖的 Cron 和 rsync 但在 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
備份可能需要任何時間,從幾分鐘到幾天,如果我每 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"
如果你把腳本的PID放到lock文件中,那麼如果新實例啟動時lock文件存在,你可以讀取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"