2012-02-22 82 views
17

我已經在此處檢查了一個解決方案,但似乎找不到一個解決方案。我正在處理大約300kb /秒的非常慢的連接。對於我的下載,我正在使用一個遙控盒,然後我將它們下載到我的房子。我試圖運行一個cronjob,它會每隔一小時在遠程和本地服務器上rsync兩個目錄。我得到了一切工作,但如果有大量的數據傳輸rsyncs重疊,並最終創建相同文件的兩個實例,從而發送重複數據。Rsync cronjob只會在rsync尚未運行的情況下運行

我想調用腳本來運行我的rsync命令,但只有在rsync沒有運行的情況下才行?

+0

下面是一個關於單個shell腳本實例的類似答案,但它需要您選擇的答案並使其更加健壯。 http://stackoverflow.com/questions/185451/quick-and-dirty-way-to-ensure-only-one-instance-of-a-shell-script-is-running-at – physicsmichael 2013-02-27 02:07:05

回答

7

通過腳本您可以創建一個「鎖定」文件。如果文件存在,cronjob應該跳過運行;否則它應該繼續。一旦腳本完成,它應該刪除鎖定文件。

 
if [ -e /home/myhomedir/rsyncjob.lock ] 
then 
    echo "Rsync job already running...exiting" 
    exit 
fi 

touch /home/myhomedir/rsyncjob.lock 

#your code in here 

#delete lock file at end of your job 

rm /home/myhomedir/rsyncjob.lock 
+0

好吧,我真的很新整個腳本的東西,發現這個:'code'if(set -o noclobber; echo「locked」>「$ lockfile」)2>/dev/null;然後 trap'rm -f「$ lockfile」;退出$?「INT TERM EXIT 回聲 」鎖定成功「>&2 RM -f 」$文件鎖「 其他 回聲 」鎖失敗 - 退出「>&2 出口1個 網絡連接'\ code' – mfpockets 2012-02-22 06:55:06

+0

它並不需要是複雜。只需創建一個鎖文件。如果使用-e來檢查文件的存在並且它存在退出;否則繼續。 – bubbly 2012-02-22 06:59:41

+0

謝謝,這將有助於我能弄清楚如何正確地鎖定文件。 :(對一個新手沒有幫助 – mfpockets 2012-02-22 15:03:24

73

與創建一個「鎖定」文件在以前的解決方案提出的問題是,鎖定文件可能已經存在,如果負責刪除它的腳本異常終止。 例如,如果用戶終止rsync進程或由於停電,可能會發生這種情況。相反,應該使用flock,它不會遇到這個問題。

碰巧的羊羣也很容易使用,因此該解決方案只會是這樣的:

flock -n lock_file -c "rsync ..."

-c選項後的命令,如果沒有其他進程鎖定在只執行LOCK_FILE。如果由於任何原因的鎖定過程終止,鎖將在lock_file上釋放。 -n選項說flock應該是非阻塞的,所以如果有另一個進程鎖定文件,則什麼都不會發生。

+1

這是絕對正確的。另一種解決方案是使用租約,而不是鎖,以便鎖定在一段時間後超時,除非續租。租約基本上是一個帶有時間戳的鎖文件。 – cha0site 2012-04-02 19:17:22

+6

工作完美。這應該是被接受的答案。 – chovy 2013-07-09 01:17:14

+1

需要注意的是,這在NFS – WarmWaffles 2013-10-19 05:52:56

4

,而無需使用鎖文件,一個簡單的解決方法就是做:

pgrep rsync > /dev/null || rsync -avz ... 

這將工作,只要它是你在服務器上運行的唯一rsync的工作,那麼你就可以直接運行這個在cron中,但您需要將輸出重定向到日誌文件。

如果你運行多個rsync的工作,你可以得到p纖ep來匹配完整的命令行,像這樣的模式:

pgrep -f rsync.*/data > /dev/null || rsync -avz --delete /data/ otherhost:/data/ 
pgrep -f rsync.*/www > /dev/null || rsync -avz --delete /var/www/ otherhost:/var/www/ 
2

要使用由@user以上,陷阱給出的鎖文件示例應該用於驗證當腳本因任何原因退出時鎖定文件被刪除。

if [ -e /home/myhomedir/rsyncjob.lock ] 
then 
    echo "Rsync job already running...exiting" 
    exit 
fi 

touch /home/myhomedir/rsyncjob.lock 

#delete lock file at end of your job 

trap 'rm /home/myhomedir/rsyncjob.lock' EXIT 

#your code in here 

這樣,即使腳本在腳本結束之前退出,鎖定文件也會被刪除。

+0

這實際上是最好的解決方案 – berezovskyi 2017-04-30 10:45:11