The OpenNET Project / Index page

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

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

"Perl & Deamon"
Сообщение от xeon emailИскать по авторуВ закладки on 07-Авг-04, 10:19  (MSK)
Подскажите пожалуйста как из обычного perl-скрипта создать демона с возможностью автоматического перезапуска при подвисании(возможно ли такое вообще?).
  Рекомендовать в FAQ | Cообщить модератору | Наверх

 Оглавление

Индекс форумов | Темы | Пред. тема | След. тема
Сообщения по теме

1. "Perl & Deamon"
Сообщение от ihor Искать по авторуВ закладки on 07-Авг-04, 14:47  (MSK)
http://cr.yp.to/daemontools.html


  Рекомендовать в FAQ | Cообщить модератору | Наверх

2. "Perl & Deamon"
Сообщение от xeon emailИскать по авторуВ закладки on 13-Авг-04, 13:48  (MSK)
А возможно ли тоже самое сделать средствами Perl`а, без daemontools`а?
  Рекомендовать в FAQ | Cообщить модератору | Наверх

3. "Perl & Deamon"
Сообщение от hatta emailИскать по авторуВ закладки(ok) on 13-Авг-04, 15:53  (MSK)
>А возможно ли тоже самое сделать средствами Perl`а, без daemontools`а?
#!/usr/bin/perl -w

use POSIX;

if (!fork()) {
    setsid();       # Отключаемся от терминала
} else {
    die;
}

$set = POSIX::SigSet->new();
$act = POSIX::SigAction->new(SIG_IGN, $set); # Игнорируем
sigaction(SIGTTOU, $act);                    # терминальные сигналы,
sigaction(SIGTTIN, $act);                    # что, в принципе, делать
sigaction(SIGTSTP, $act);                    # необязательно
while(1){
    sleep 1000;                              # всякая полезная работа!
}

  Рекомендовать в FAQ | Cообщить модератору | Наверх

4. "Perl & Deamon"
Сообщение от hatta emailИскать по авторуВ закладки(ok) on 13-Авг-04, 16:09  (MSK)
А насчет перезапуска при зависании - это сложнее. Как определить момент зависания? Вот если перезапуск при вылете, тогда проще. Тогда надо просто добавить еще один fork() в то место, где делаем работу:

while(1) {
    print "perezapusk\n";
    if(!fork()){
        # rabotaem
        sleep 1;
        exit 0; # eto moment vyleta
    } else {
        wait();
    }
}

  Рекомендовать в FAQ | Cообщить модератору | Наверх

6. "Perl & Deamon"
Сообщение от xeon emailИскать по авторуВ закладки on 13-Авг-04, 21:26  (MSK)
>А насчет перезапуска при зависании - это сложнее. Как определить момент зависания?
>Вот если перезапуск при вылете, тогда проще. Тогда надо просто добавить
>еще один fork() в то место, где делаем работу:
>
>while(1) {
>    print "perezapusk\n";
>    if(!fork()){
>        # rabotaem
>        sleep 1;
>        exit 0; # eto
>moment vyleta
>    } else {
>        wait();
>    }
>}

Да, зависание определить будет сложно. А как тогда организовать перезапуск программки например каждые 15 минут?

  Рекомендовать в FAQ | Cообщить модератору | Наверх

7. "Perl & Deamon"
Сообщение от xeon emailИскать по авторуВ закладки on 13-Авг-04, 21:33  (MSK)
Хотя конечно это как-то не по-людски. Как вариант можно определять зависания, проверяя время последней записи в файл.
  Рекомендовать в FAQ | Cообщить модератору | Наверх

5. "Perl & Deamon"
Сообщение от xeon emailИскать по авторуВ закладки on 13-Авг-04, 21:17  (MSK)
>>А возможно ли тоже самое сделать средствами Perl`а, без daemontools`а?
>#!/usr/bin/perl -w
>
>use POSIX;
>
>if (!fork()) {
>    setsid();       #
>Отключаемся от терминала
>} else {
>    die;
>}
>
>$set = POSIX::SigSet->new();
>$act = POSIX::SigAction->new(SIG_IGN, $set); # Игнорируем
>sigaction(SIGTTOU, $act);          
>         # терминальные
>сигналы,
>sigaction(SIGTTIN, $act);          
>         # что,
>в принципе, делать
>sigaction(SIGTSTP, $act);          
>         # необязательно
>
>while(1){
>    sleep 1000;      
>          
>          
> # всякая полезная работа!
>}

Этот скрипт вылетает с сообщением:
#test.pl
Died at ./test.pl line 8.
У меня Linux Fedora 1, Perl v5.8.3

  Рекомендовать в FAQ | Cообщить модератору | Наверх

8. "Perl & Deamon"
Сообщение от hatta emailИскать по авторуВ закладки(ok) on 14-Авг-04, 14:03  (MSK)
Нет, это он не вылетает, это просто вырубается процесс-родитель. Если вместо  die там после первого форка поставить просто exit 0; то все будет тихо.
Если после сообщения die посмотреть ps, то там видно, что процесс perl есть, причем не привязан к какому-либо терминалу. Т.е. демон в нашем понимании.
  Рекомендовать в FAQ | Cообщить модератору | Наверх

9. "Perl & Deamon"
Сообщение от xeon emailИскать по авторуВ закладки(??) on 16-Авг-04, 19:05  (MSK)
>Нет, это он не вылетает, это просто вырубается процесс-родитель. Если вместо  
>die там после первого форка поставить просто exit 0; то все
>будет тихо.
>Если после сообщения die посмотреть ps, то там видно, что процесс perl
>есть, причем не привязан к какому-либо терминалу. Т.е. демон в нашем
>понимании.


Действительно - так оно и есть. Огромное спасибо за помощь.

  Рекомендовать в FAQ | Cообщить модератору | Наверх


Удалить

Индекс форумов | Темы | Пред. тема | След. тема
Пожалуйста, прежде чем написать сообщение, ознакомьтесь с данными рекомендациями.




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

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