[Comm] Зеркалирование по расписанию.

Yura Kalinichenko =?iso-8859-1?q?yuk_=CE=C1_kalina=2Ein=2Eua?=
Вс Мар 22 22:53:51 MSK 2009


Vladimir Karpinsky пишет:
> Yura Kalinichenko пишет:
>>> Насколько я понял, --- понял ещё не всё, разбираюсь, --- это не 
>>> совсем то. У меня проблема такая: по крону раз в 15 минут 
>>> запускается скрипт, пытающийся достучаться до удалённого ресурса и 
>>> скачать оттуда данные. Связь, даже когда она есть, терпимая, хуже 
>>> другое: 20 часов из 24 нет там нет электричества. Скрипт без связи 
>>> отваливается, лок-файл удаляется, всё хорошо. Мне надо отследить 
>>> момент, когда связь есть, и уже происходит перекачка данных, а тут 
>>> подходит время следующего запуска скрипта: возможны разные 
>>> неприятности при одновременной закачке, поэтому повторный скрипт 
>>> должен обнаружить блокировку и просто отвалится, не трогая её.
>> Так это и происходит, когда используете для блокировки функцию 
>> test_lock. Плюс проверяется - существует ли еще процесс, создавший 
>> блокировку, и если нет (напр. был убит по kill -9) - блокировка 
>> перехватывается.
>
> Я  прошу прощения, а что такое kill -0? kill -l про сигнал 0 молчит... 
Ну это в общем-то классика. Этот псевдосигнал используется для проверки 
существования процесса. Вот что говорит, к примеру, info kill:

The special signal number `0' does not denote a valid signal, but can
be used to test whether the PID arguments specify processes to which a
signal could be sent.


> Я до конца не понимаю смысл цикла until: ставится запрет на перезапись 
> существующего файла и дальше зацикливаемся в попытке его перезаписать. 
> Далее, если kill -0 успешен,
Т.е. лок выставлен, и процесс, его создавший, активен
> то удалять лок-файл не надо, ждём, что он процессе счёта до 10 сам 
> уйдёт (?)
Т.е. ожидаем (если нужно) что процесс, заблокировавший ресурс, 
завершится сам и тогда мы выставим свою блокировку и начнем свою обработку.
> или мы его убьём в следующей итерации until.
Не его - себя. Если за определенное время процесс, ранее заблокировавший 
ресурс, его не освободил - обычно ждать далее не имеет смысла, и мы 
выходим в расчете на следующий запуск. Хотя иногда (но не в вашей 
ситуации) может иметь смысл ожидать до победного конца.
> Что-то я запутался, пните, пожалуйста, в нужном направлении.
>
>>> А если произойдёт штатный выход или kill -9, то блокировку надо 
>>> снять, чтобы разрешить следующий запуск. kill -9 нужен на тот 
>>> случай, когда связь разрывается в процессе закачки и скрипт 
>>> подвисает (wget не отваливается). Для отработки такого случая, я 
>>> убиваю соответствующий pid, в том случае, когда блокировка есть, а 
>>> связи нет.
>> IMHO, логичнее заставить wget отваливаться при разрыве связи 
>> (--timeout ?). Убивать чужой процесс - как-то некрасиво.
>
> Полностью согласен, но мои эксперименты с выдёргиванием сетевого шнура 
> из компьютера, с котрого уже качает wget, показал, что wget не 
> отваливается, несмотря на наличие таймаутов.
Странно. Только что проверил: wget --timeout=3 -c 'http://...' 
благополучно разрывается через 3 сек. после выдергивания шнура либо 
укладывания интерфейса.


-- 
SY, 
   Yura Kalinichenko



Подробная информация о списке рассылки community