LinuxForum.Fans
Тема

Циклическое выполнение скрипта на сервере

Автор: kennedy 25 сообщений 4521 просмотров
#81663
kennedy написал:
Cruiser78, Вы не внимательно читали. Весь смысл в непрерывном повторении. Новый не начнется пока не закончится предыдущий. "мульен процессов" возникнуть не должно. Сервер в ДЦ, доступ только у меня, 777 что бы не заморачиваться smile

Коллега, Вы невнимательно читали мой текст (и пропустили часть, большую, основ функционирования юникса). А именно, между скриптами

text

1. wget _ttp://site.ru/file.txt; mv /var/scr/file.txt; /var/scr/scr.txt;
2. wget _ttp://site.ru/file.txt; mv /var/scr/file.txt; /var/scr/scr.txt &;

есть принципиальная разница. Первый (родительский) скрипт не завершится до тех пор, пока не завершится последняя команда в нем. А поскольку он вызывает сам себя - то он не завершится никогда. Равно как и вызванный любой экземпляр этого скрипта. Так как этот любой экземпляр будет ожидать завершения своего "потомка".
В результате Вы быстро исчерпаете весь доступный пул PID'ов и забъете память сервера своими ожидающими завершения (вечно) процессами, которые еще и размножаются непрерывно. Не думаю, что системный админ этого сервера Вам за это спасибо скажет. А вот крепость морды лица пощупать сможет.

Во втором случае родительский процесс запускает на исполнение потомка, но уже не ждет его завершения. В результате мы не имеем размножения в памяти этого процесса. Но и это плохо. Так как прибить при необходимости такую цепочку процессов может быть крайне сложно. А именно - если файл на копирование большой и копирование его занимает длительное время, то можно определить его pid и выполнить команду kill -9 <pid>. Но, если файлик копируемый маленький и копируется быстро, то далеко не факт, что команда kill убъет Ваш процесс. Так как пока админ будет вычислять его pid, этот процесс завершится и запустится новый, с новым pid'ом. Не думаю, что системный админ этого сервера Вам за это спасибо скажет. А вот крепость морды лица пощупать сможет.

Резюмирую - Ваш вариант решения поставленной задачи крайне неудачен для реализации на промышленном сервере. За подготовку и несанкционированый запуск подобного скрипта я бы увольнял запустившего его перца без каких либо объяснений по несоответствию занимаемой должности. Как минимум. Поскольку по анализу приведенных скриптов можно сделать вывод о стремлении их автора (если он обладает минимальной квалификацией и понимает суть выполняемых им действий) нагадить конторе. Не думаю, чтобы Вам это понравилось.

Это первое. А второе - если Ваша задача (не понимаю, правда, её жизненной сути, зачем она нужна) Вам нужна и у Вас нет цели нагадить системному админу подопытного сервера (со всеми вытекающими из этого для Вас неприятными последствиями) - тогда запомните крепко: любое нерерывное, циклически повторяющееся, действие надо оформлять только циклом и только в одном скрипте не допуская его рекурсивного вызова. Особенно если не предусматривать ограничение глубины этой рекурсии. Рекурсия вещь насколько хорошая, настолько и опасная. А на серверах, которыми пользуетесь не только Вы, она опасна вдвойне. Одиночный же зависший процесс прибить, кильнуть, можно легко при такой необходимости.

#81664
kennedy написал:
подскажите как записать...

for ($i;$i<100;$i++) {

команда;

}

вариатов масса. Например, так:

text
for i in `seq 100`; do
....
done

Или так:

text
         #!/bin/bash
         i=0
         while [  $i -lt 100 ]; do
            ........
             i=i+1
         done
#81688

сервер специально взял для этой цели. кроме данного скрипта на сервере не будет абсолютно ничего. так что бить меня некому. Задача конечно глупая. Нужно накрутить трафик. ДЦ кстати в курсе тоже сказали что бить меня не будут :cool:

то есть насколько я понял мне нужно сделать вот так?

#!/bin/bash
while :;
do
cd /var/scr/; wget _ttp://site.ru/file.txt; rm /var/scr/file.txt;
echo $$ > /tmp/test.pid
done

И все получиться? В таком случаи как мне остановить скрипт в случаи ошибки? например отсутствия соединения?

Как называется этот язык программирования (который абсолютно не похожий на все нормальные)? :O

#81702
kennedy написал:

Как называется этот язык программирования (который абсолютно не похожий на все нормальные)? :O

http://tldp.org/LDP/abs/html/

#81720
kennedy написал:
сервер специально взял для этой цели. кроме данного скрипта на сервере не будет абсолютно ничего. так что бить меня некому. Задача конечно глупая. Нужно накрутить трафик. ДЦ кстати в курсе тоже сказали что бить меня не будут :cool:

Значит, если бы поспешили с запуском своей редакции скрипта, то пришлось бы заниматься через пару секунд|минут самоистязанием.

kennedy написал:

то есть насколько я понял мне нужно сделать вот так?

#!/bin/bash
while :;
do
cd /var/scr/; wget _ttp://site.ru/file.txt; rm /var/scr/file.txt;
echo $$ > /tmp/test.pid
done

И все получиться? В таком случаи как мне остановить скрипт в случаи ошибки? например отсутствия соединения?
:O

Примерно так. Но поизящнее будет чуть иначе:

text

#!/bin/bash - это указание, что скрипт будет исполняться в командном интерпретаторе bash (их много, можно брать любой)
cd /var/scr/   # это лучше сделать один раз.
echo $$ > /tmp/$(basename $0).pid  # здесь сохраним идентификатор процесса (pid) в файле /tmp/<имя скрипта>.pid
while :; do  
wget _ttp://site.ru/file.txt
rm /var/scr/file.txt
done

1. Я вынес из тела цикла то, что в данном цикле не нужно совершенно.
2. Прибитие процесса - kill -9 < /tmp/<имя скрипта>.pid или запускаем ps aux | grep <имя скрипта>, глазами выглядываем pid и делаем kill -9 на этот pid.
3. Можно поставить файл-флажок, если есть флажок, то качать, флажок пропал - умереть. Например так:

text

#!/bin/bash - это указание, что скрипт будет исполняться в командном интерпретаторе bash (их много, можно брать любой)
cd /var/scr/   # это лучше сделать один раз.
echo $$ > /tmp/$(basename $0).pid  # здесь сохраним идентификатор процесса (pid) в файле /tmp/<имя скрипта>.pid
echo flag >$(dirname $0)/$(basename $0).flag # поставили флажок
while [ -e $(dirname $0)/$(basename $0).flag ] ;   do
  wget _ttp://site.ru/file.txt
  rm /var/scr/file.txt
done

Код возврата - это $?. Если все хорошо, то этот код равен 0. Иначе - разбирай ошибки.
Словом, вариантов масса. Язык шелловский несложен совершенно. Конструкции в нем почти те же, что и в иных языках. Сложность начинается тогда, когда приходят регулярные выражения.

Войдите или зарегистрируйтесь, чтобы ответить.