2016-04-28 36 views
1
#!/bin/bash 
z=1 
b=$(date)  
while [[ $z -eq 1 ]]  
do  
     a=$(date)  
     if [ "$a" == "$b" ]  
     then  
       b=$(date -d "+7 days")  
       rsync -v -e ssh [email protected]_address:~/sample.tgz /home/kartik2     
       sleep 1d  
     fi  
done  

我想rsync每週一個文件!但是,如果我在每次啓動時啓動此腳本,則每次系統啓動時都會rsynced!如何更改代碼以滿足週期rsync? (PS-我不想這樣做通過cronjob - 學校作業)shell腳本rsync每週沒有cronjob文件(學校分配)

+1

'cron'可能是一個很好的開始。 – Jakuje

+0

爲什麼不使用cron?它的設計正是爲了這個目的:編寫你想要的任何腳本,並讓cron負責執行它的調度。 –

+0

我真的對你爲什麼不能使用cron感興趣? – Harry

回答

1

你說的是這個運行幾個星期吧?所以,我們必須考慮到系統將被重新啓動,並且需要無人值守地運行。總之,即使在周圍沒有人的情況下,您也需要一些方法確保腳本每週至少運行一次。該方案是這樣的

選項1(最差)
您設定提醒自己,你每次登錄的一週並運行該腳本。雖然你可能是一個可靠的人,但這不允許你去度假。此外,這違背了我們「無人居住」的原則。

選項2(好)
您可以後臺進程(./once-a-week.sh &),但這將不可靠的一段時間。除此之外,如果系統重新啓動,那麼你的腳本將不會運行,你不會知道。

選項3(更好)
對於這個可靠數週一個選項是守護進程的腳本。有關此事的更詳細討論,請參閱:Best way to make a shell script daemon?

您需要確保守護程序在重新引導或系統故障後啓動。有關此事的更多討論,請參見:Make daemon start up with Linux

選項4(最好)
你說沒有cron但它確實是最好的選擇。特別是,在不需要運行的情況下,6天,23小時和59分鐘不會消耗系統資源。另外,它自然可以重新啓動等。所以,我不得不說,創建類似下面的crontab條目將是我的最高票:@weekly /full/path/to/script


如果您選擇選項2或以上3,您需要修改您的腳本包含其中腳本上次成功完成其運行的星期編號變量(date +%V)。問題是,只有在內存中意味着它不會在重新啓動後保持。

爲了使上述任何一項更具彈性,最好創建一個可存儲文件的目錄作爲信號量(例如week21.txt)或存儲上次運行狀態的文件。像once-a-week.state的東西,你會寫一個值運行時:

date +%V > once-a-week.state # write the week number to a file 

然後讀取值,你會:

file="/path/to/once-a-week.state" # the file where the week number is stored 
read -d $'\x04' name < "$file" 
echo "$name" 

然後,您需要檢查,看看是否週數匹配這個目前的週數,並根據是否匹配處理所需的操作。

+0

欣賞它!非常感謝! – kartik

1
#!/bin/bash 
z=1 
b=$(cat f1.txt) 
while [[ $z -eq 1 ]] 
do 
     a=$(date +"%d-%m-%y") 
     if [ "$a" == "$b" ] || [ "$b" == "" ] || [$a -ge $b ] 
     then 
       b=$(date +"%d-%m-%y" -d "+7 days") 
       echo $b > f1.txt 
       rsync -v -e ssh [email protected]:~/sample.tgz /home/user 
       if [ $? -eq 0 ] 
       then 
         sleep 1d 
       fi 
     fi 
done 

此代碼似乎運作良好,好!對它的任何更改都會讓我知道

+0

爲什麼你不是簡單地使用'crontab -e'(如果你想讓這個腳本作爲你個人的crontab的一部分運行)並且添加'@weekly rsync -v -e ssh HOST @ ip:〜/ sample.tgz /家用/ user'? '@ weekly'只是'0 0 * * 0'的簡寫。 –

+0

因爲我被指示不要使用我的proff使用crontab!沒有違規 – kartik

+0

那麼,那麼 - 這更有意義':)' –