Mac-Osx

使用文件鎖的 Cron 和 rsync 但在 Mac OS X Server 上有更好的方法嗎?

  • September 9, 2012

我有這個 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"

引用自:https://serverfault.com/questions/238235