2015-05-05 3 views
2

Я сделал веб-сервер, чтобы показывать свою страницу локально, потому что находится в месте с плохим подключением, поэтому я хочу загрузить содержимое страницы и заменить старую, поэтому я сделал этот скрипт работает в фоновом режиме, но я не очень уверен, что это будет работать 24/7 (2m - это просто проверить его, но я хочу, чтобы он подождал 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

Не запускайте wget и распакуйте его как root. Вместо этого задайте разрешения на/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 .. но я предпочитаю завиток
  • logger, который, вероятно, установлен в вашей системе вместе с syslog или rsyslog или может быть частью пакета unix-util в зависимости от вашего дистрибутива Linux.

rsync предоставляет много полезной функциональности. В частности:

  • пытается скопировать только то, что изменилось, так что вы не тратите пропускную способность на файлы, которые являются такими же,
  • опция --link-dest позволяет ссылаться на предыдущие каталоги, чтобы создать " ссылки "на файлы, которые не изменились, так что вы можете иметь несколько копий своего каталога с единственными копиями неизмененных файлов.

Для того, чтобы сделать это пойти, как rsync часть и ssh часть, вам нужно будет настроить ключи SSH, которые позволяют подключаться без запроса пароля. Это не сложно, но если вы уже не знаете об этом, это тема другого вопроса .. или простой поиск с вашей любимой поисковой системой.

Вы можете запустить из кронтаба каждые 5 минут:

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

Если вы хотите, чтобы запустить его чаще, обратите внимание, что «движение» вы будете использовать для каждой проверки, что делает не привлекать обновление - это HTTP GET файла flag.txt.

+0

Спасибо вам большое. Но у меня есть вопрос: если вы синхронизируете, например, папку, где находится «index.html», и вы загружаете новую версию, старый перезаписывается или модифицируется ?. Я прошу вас, потому что у меня были проблемы с браузером, который я использую, потому что в некотором случае, когда я перезаписываю индексный файл, он просто стирает старый, чтобы скопировать новый, и система показывает сбой, потому что система не иметь любой файл, а затем, когда новый копируется, система не перезагружается и остается пустой. –

+0

Проверьте справочную страницу 'rsync', как работает опция' -link-dest'. Идея здесь заключается в том, что вы сохраните одну главную версию своего сайта на удаленном сервере, а затем используйте rsync для поддержки «инкрементных» копий. Поэтому, если вы обновите индекс.html на сервере, ваш следующий rsync поместит новый index.html в датированный каталог на вашей клиентской машине, а символическая ссылка укажет на новое местоположение. – ghoti

+0

В связи с тем, что ваш браузер «замечает», что файл обновлен, вы можете отключить кеш в своем браузере или изучить заголовки HTTP на вашем веб-сервере, например «Expires» или «ETag» или «Cache-Control», , Как вы решаете, это будет зависеть от вашего веб-сервера и браузера, и это вопрос другого вопроса. – ghoti

2

Я хотел бы предложить создание работа cron, это намного надежнее, чем скрипт с огромными sleep с.

Краткие инструкции:

Если у вас есть права на запись для /var/www/, просто поставить загрузку в ваш персональный файл заданий. Run 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/ 

Или вы можете запустить загрузку из системы кронтаба. Создать файл /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.

Или вы можете поместить все необходимые команды в один скрипт, как этот:

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

и вызывать его из кронтаб:

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

Эта задача будет выполняться два раза в день: в 4: 17 и 16:17. Вы можете установить другое расписание, если хотите.

Больше на хрон рабочих мест, crontabs и т.д.:

Смежные вопросы