The OpenNET Project / Index page

[ новости /+++ | форум | wiki | теги | ]

форумы  помощь  поиск  регистрация  майллист  ВХОД  слежка  RSS
"совместное использование sleep() & alert()"
Вариант для распечатки  
Пред. тема | След. тема 
Форумы Программирование под UNIX (Public)
Изначальное сообщение [Проследить за развитием треда]

"совместное использование sleep() & alert()" 
Сообщение от dimcha emailИскать по авторуВ закладки(??) on 14-Ноя-05, 11:54  (MSK)
Как заставить корректно работать sleep() в Perl?

Ситуация следующая:

пишу монитор-демона автоматического рестарта сервиса.
alert используется для отлова таймаута в connect.
sleep используется для ожидания следующей итерации

в итоге имеем:

while(...) {

  <exec_service_if_needed>

  sleep $sleep_time;

  check_connect(...)

}

sub check_connect {
<...>
eval {
            local ( $SIG{'ALRM'} ) = sub { die "connect timeout\n" };
            alarm( $ct );
            connect( $sock, $paddr ) || die "connect: $!\n";
            alarm( 0 );
         };

<...>
}


Так вот sleep при перезапуске сервиса не срабатывает и скрипт работает дальше. Сервис не успевает стартовать когда его проверяют и его(сервис) рестартуют снова. Но тут sleep уже срабатывает как надо.

Есть идеи как вылечить sleep?

В манах написано что использовать sleep и alarm вместе нежелательно, но других возможностей заставить процесс спать я не знаю. Подскажите где почитать и чего делать.

  Правка | Высказать мнение | Ответить | Рекомендовать в FAQ | Cообщить модератору | Наверх

 Оглавление

Сообщения по теме [Сортировка по времени, UBB]

1. "совместное использование sleep() & alert()" 
Сообщение от ACCA Искать по авторуВ закладки(ok) on 15-Ноя-05, 08:39  (MSK)
Непонятно, что же ты хочешь сделать. Зачем eval вокруг connect?

И чем не нравится рестартовать сервис через inetd?

  Удалить Правка | Высказать мнение | Ответить | Рекомендовать в FAQ | Cообщить модератору | Наверх

2. "совместное использование sleep() & alert()" 
Сообщение от dimcha emailИскать по авторуВ закладки(??) on 15-Ноя-05, 10:05  (MSK)
>Непонятно, что же ты хочешь сделать. Зачем eval вокруг connect?
для реализации connect timeout'а. или ты знаешь как можно сделать по-другому?

>И чем не нравится рестартовать сервис через inetd?
clamav, postfix, httpd, bind, mysql, etc.. через inetd???

проще демона в 40 строк написать, которые все это будет отслеживать и рестартовать. Но вот проблема именно с погружением процесса в сон =(

  Удалить Правка | Высказать мнение | Ответить | Рекомендовать в FAQ | Cообщить модератору | Наверх

3. "совместное использование sleep() & alert()" 
Сообщение от ACCA Искать по авторуВ закладки(ok) on 15-Ноя-05, 21:04  (MSK)
>>Непонятно, что же ты хочешь сделать. Зачем eval вокруг connect?
>для реализации connect timeout'а. или ты знаешь как можно сделать по-другому?

Знаю, потому и спросил. По-моему ты выбрал самый запутанный способ это сделать.


>проще демона в 40 строк написать, которые все это будет отслеживать и
>рестартовать. Но вот проблема именно с погружением процесса в сон =(

Если проблема в том, что дохнут серверы и нет желания разбираться, почему именно, то можно повесить shell скрипт cron'у. netcat и/или ps сделают всё необходимое.

  Удалить Правка | Высказать мнение | Ответить | Рекомендовать в FAQ | Cообщить модератору | Наверх

4. "совместное использование sleep() & alert()" 
Сообщение от rWizard emailИскать по авторуВ закладки(??) on 15-Ноя-05, 21:12  (MSK)
попробуйте select(undef,undef,undef,$sleep_timeout);

Но, ИМХО.. какой-то очень странный способ вы выбрали.

  Удалить Правка | Высказать мнение | Ответить | Рекомендовать в FAQ | Cообщить модератору | Наверх

5. "совместное использование sleep() & alert()" 
Сообщение от dimcha emailИскать по авторуВ закладки(??) on 16-Ноя-05, 10:19  (MSK)
>попробуйте select(undef,undef,undef,$sleep_timeout);
>
>Но, ИМХО.. какой-то очень странный способ вы выбрали.

мне казалось, что это самый, что ни на есть, стандартный способ. За идею спасибо, но проблема оказалась в следующем:

перед sleep() делался fork-exec. Запускался сервис, который сам по себе является демоном. Соответственно потомок моментально завершался и родительскому процессу посылался sigchld, в котором sleep() прерывался по INTR.

  Удалить Правка | Высказать мнение | Ответить | Рекомендовать в FAQ | Cообщить модератору | Наверх

6. "совместное использование sleep() & alert()" 
Сообщение от rWizard emailИскать по авторуВ закладки(??) on 17-Ноя-05, 01:47  (MSK)
Я писал вообще про способ проверки.
Мне кажется, что в большенстве случаев хватает способа использванного в daemon-dools от DJB или, например в safe-mysqld :

while(1) {
system('/patch/to/daemon --foreground');
print 'Daemon crahed', "\n";
}

  Удалить Правка | Высказать мнение | Ответить | Рекомендовать в FAQ | Cообщить модератору | Наверх


Архив | Удалить

Индекс форумов | Темы | Пред. тема | След. тема
Оцените тред (1=ужас, 5=супер)? [ 1 | 2 | 3 | 4 | 5 ]




Спонсоры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2022 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру