2015-05-05 96 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等: