2015-05-05 187 views
2

我做了一個web服務器來顯示我的網頁在本地,因爲位於一個連接不好的地方,所以我想要做的是下載頁面內容並替換舊的,所以我做這個腳本在後臺運行,但我不是很確定這是否可以全天候工作(2米只是爲了測試它,但我希望它會等待6-12小時),所以,¿你對這個腳本有什麼看法?是不安全的?或者對於我在做什麼而言足夠了?謝謝。腳本下載網頁

#!/bin/bash 
a=1; 
while [ $a -eq 1 ] 
do 
echo "Starting..." 
sudo wget http://www.example.com/web.zip --output-document=/var/www/content.zip 
sudo unzip -o /var/www/content.zip -d /var/www/ 
sleep 2m 
done 
exit 

UPDATE:此代碼我現在用: (只是一個原型,但我假裝不使用sudo)

#!/bin/bash 
a=1; 
echo "Start" 
while [ $a -eq 1 ] 
do 
echo "Searching flag.txt" 
if [ -e flag.txt ]; then 
    echo "Flag found, and erasing it" 
    sudo rm flag.txt 

    if [ -e /var/www/content.zip ]; then 
    echo "Erasing old content file" 
     sudo rm /var/www/content.zip 
    fi 
    echo "Downloading new content" 
    sudo wget ftp://user:[email protected]/content/newcontent.zip --output-document=/var/www/content.zip 
    sudo unzip -o /var/www/content.zip -d /var/www/ 
    echo "Erasing flag.txt from ftp" 
    sudo ftp -nv < erase.txt 
    sleep 5s 
else 
    echo "Downloading flag.txt" 
    sudo wget ftp://user:[email protected]/content/flag.txt 
    sleep 5s 
fi 
echo "Waiting..." 
sleep 20s 

done 
exit 0 

erase.txt

open xx.xx.xx.xx 
user user password 
cd content 
delete flag.txt 
bye 
+2

請勿以root身份運行wget並解壓縮。相反,請在/ var/www上設置權限,以便使用此腳本可以訪問需要的文件。您還應該考慮使用系統cron工具而不是循環來執行計劃。有關更多信息,請參閱「man crontab」。 – BadZen

+0

同意上面的評論。也在這裏搜索S.O.對於許多* nix crontab問題提出非常類似的問題。祝你好運。 – shellter

+0

你有沒有想過使用['rsync'](http://linux.die.net/man/1/rsync)? – ghoti

回答

1

只需unzip平內容的新版本凌駕舊的未必是最好的解。如果你從你的網站刪除一個文件會怎麼樣?本地副本仍然會有。此外,使用基於zip的解決方案,您每次複製時都會複製每個文件,而不僅僅是已更改的文件。

我建議您改用rsync來同步您的網站內容。

如果設置本地的DocumentRoot像/var/www/mysite/,另一種腳本可能則是這個樣子:

#!/usr/bin/env bash 

logtag="`basename $0`[$$]" 

logger -t "$logtag" "start" 

# Build an array of options for rsync 
# 
declare -a ropts 
ropts=("-a") 
ropts+=(--no-perms --no-owner --no-group) 
ropts+=(--omit-dir-times) 
ropts+=("--exclude ._*") 
ropts+=("--exclude .DS_Store") 

# Determine previous version 
# 
if [ -L /var/www/mysite ]; then 
    linkdest="$(stat -c"%N" /var/www/mysite)" 
    linkdest="${linkdest##*\`}" 
    ropts+=("--link-dest '${linkdest%'}'") 
fi 

now="$(date '+%Y%m%d-%H:%M:%S')" 

# Only refresh our copy if flag.txt exists 
# 
statuscode=$(curl --silent --output /dev/stderr --write-out "%{http_code}" http://www.example.com/flag.txt") 
if [ ! "$statuscode" = 200 ]; then 
    logger -t "$logtag" "no update required" 
    exit 0 
fi 

if ! rsync "${ropts[@]}" [email protected]:/var/www/mysite/ /var/www/"$now"; then 
    logger -t "$logtag" "rsync failed ($now)" 
    exit 1 
fi 

# Everything is fine, so update the symbolic link and remove the flag. 
# 
ln -sfn /var/www/mysite "$now" 
ssh [email protected] rm -f /var/www/flag.txt 

logger -t "$logtag" "done" 

此腳本使用,您可能需要安裝,如果他們沒有幾個外部工具已經在你的系統上:

  • rsync的,你已經瞭解,
  • 捲曲,這可能與wget的替代..但我更喜歡捲曲
  • 記錄器,它可能與syslog或rsyslog一起安裝在系統中,或者可能是「unix-util」包的一部分,具體取決於您的Linux發行版。

rsync提供了很多有用的功能。特別是:

  • 它試圖複製僅發生了什麼變化,這樣你就不會浪費上是相同的文件帶寬,
  • --link-dest選項,您可以參考以前的目錄創建「鏈接「到未更改的文件,以便您可以擁有目錄的多個副本,只有未更改文件的單個副本。

爲了使這一去,無論是rsync部分和ssh部分,你將需要設置SSH密鑰,讓您無需密碼即可連接。這並不難,但是如果你不知道它,這是另一個問題的主題。或者用你最喜歡的搜索引擎進行簡單的搜索。

您可以從一個crontab運行這個每5分鐘:

*/5 * * * * /path/to/thisscript 

如果你想更頻繁地運行它,請注意,「交通」您將使用爲每個檢查,做涉及更新是flag.txt文件的HTTP GET。

+0

非常感謝。但我有一個問題:如果你同步,例如,「index.html」的文件夾,你上傳一個新版本,舊的被覆蓋或修改?我問你,因爲我在使用瀏覽器時遇到了問題,因爲在某些情況下,當我覆蓋索引文件時,它只是擦除舊的文件來複制新文件,系統顯示失敗,因爲系統沒有有任何文件,然後當複製新文件時,系統不會重新加載並保持空白 –

+0

檢查'rsync'手冊頁瞭解'--link-dest'選項的工作方式。這裏的想法是,您將在遠程服務器上保留一個站點的主站版本,然後使用rsync來維護「增量」副本。所以如果你更新索引。在服務器上,你的下一個rsync會把新的index.html放到客戶端機器上的日期目錄中,並且符號鏈接將指向新的位置。 – ghoti

+0

對於瀏覽器「注意」文件已更新的問題,您可能可以禁用瀏覽器中的緩存,或瀏覽Web服務器中的HTTP標題,例如「Expires」或「ETag」或「Cache-Control」 。你如何解決這個問題將取決於你的Web服務器和瀏覽器,並且是另一個問題的主題。 – ghoti

2

我建議設立一個cron工作,這比一個擁有巨大sleep s的腳本更可靠。

簡要說明:

如果您有/var/www/寫權限,只需把下載在個人的crontab。 運行crontab -e,粘貼內容,從編輯器保存退出:

17 4,16 * * * wget http://www.example.com/web.zip --output-document=/var/www/content.zip && unzip -o /var/www/content.zip -d /var/www/ 

或者你可以運行系統crontab文件的下載。 創建文件/etc/cron.d/download-my-site並把這些內容進入:

17 4,16 * * * <USERNAME> wget http://www.example.com/web.zip --output-document=/var/www/content.zip && unzip -o /var/www/content.zip -d /var/www/ 

替換<USERNAME>使用具有適當權限/var/www登錄。

或者你可以把所有必要的命令到一個shell腳本是這樣的:

#!/bin/sh 
wget http://www.example.com/web.zip --output-document=/var/www/content.zip 
unzip -o /var/www/content.zip -d /var/www/ 

,並從crontab中調用它:

17 4,16 * * * /path/to/my/downloading/script.sh 

此任務將每天跑兩次:4: 17日和16:17。如果你願意,你可以設定另一個時間表。

更多關於cron作業,的crontab等: