The OpenNET Project / Index page

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

форумы  помощь  поиск  регистрация  майллист  вход/выход  слежка  RSS
"Почему так происходит? (Perl,fork,pipe,FreeBSD,rc.d)"
Вариант для распечатки  
Пред. тема | След. тема 
Форум Программирование под UNIX (Perl)
Изначальное сообщение [ Отслеживать ]

"Почему так происходит? (Perl,fork,pipe,FreeBSD,rc.d)"  +/
Сообщение от yooo on 04-Янв-11, 22:05 
Вообшем вопрос следующий: есть rc.d скрипт, который при запуске системы запускает скрипт написаный на Perl. Perl-скрипт содержит следующий код:
--------------------------------------------------------------
fork() && exit;
if ( -e $conf{PID_FILE} ){
    print "ERROR: pid file [ $conf{PID_FILE} ] already exist\n";
    syslog('ERR', "pid file [ $conf{PID_FILE} ] already exist");
    exit 1;
}else{
    open(PIDF,">$conf{PID_FILE}") or die "ERROR: can not open file $conf{PID_FILE}: $! \n";
        print PIDF "$$\n";
    close (PIDF);
}
# перехватываем сигналы, для корректного выхода
$SIG{'INT'} = $SIG{'QUIT'} = $SIG{'TERM'} = 'quit';
$SIG{'HUP'} = 'ignore';
close STDOUT; close STDERR; close STDIN;

if ( $$ ){
    syslog('NOTICE', "Started myscript.");
    $tail_pid = open($fh,"/usr/bin/tail -n 0 -F $conf{ACCESS_LOG} |") or die "$!";

    while ( <fh> ){
    # !!! какой-то код
    }
    close($fh);
}
-------------------------------------------------------------------------
если запускаю rc.d скрипт "ручками" из терминала: /etc/rc.d/myscript start
то все отлично отрабатывает, мой Perl-скрипт весит как демон.

Но если скрипт запускать при загрузке системы то цикл while не срабатывает, почему-то условие (<$fh>) принимает значение ЛОЖЬ. Народ объясните почему так происходит.


Ответить | Правка | Cообщить модератору

Оглавление

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


1. "Почему так происходит? (Perl,fork,pipe,FreeBSD,rc.d)"  +/
Сообщение от yooo on 05-Янв-11, 01:13 
-- еще одно наблюдение ---
Методом тыка выяснил, что если перед функцией open() поставить функцию sleep(5), то проблема исчезает.

P.S Плиз объясните почему так происходит.

Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

2. "Почему так происходит? (Perl,fork,pipe,FreeBSD,rc.d)"  +/
Сообщение от GD on 05-Янв-11, 02:21 
> -- еще одно наблюдение ---
> Методом тыка выяснил, что если перед функцией open() поставить функцию sleep(5), то
> проблема исчезает.
> P.S Плиз объясните почему так происходит.

пустой $conf{ACCESS_LOG} на момент старта скрипта?

Ответить | Правка | ^ к родителю #1 | Наверх | Cообщить модератору

3. "Почему так происходит? (Perl,fork,pipe,FreeBSD,rc.d)"  +/
Сообщение от yooo on 05-Янв-11, 10:19 
> пустой $conf{ACCESS_LOG} на момент старта скрипта?

Нет. Не пустой. Проверял вот так:
----------
    if ( -e $conf{ACCESS_LOG} ){
        syslog('NOTICE', "file $conf{ACCESS_LOG} exist.");
    }else{
        syslog('NOTICE', "file $conf{ACCESS_LOG} not  exist.");
    }

    if ( -e '/usr/bin/tail' ){
        syslog('NOTICE', "file /usr/bin/tail exist.");
    }else{
        syslog('NOTICE', "file /usr/bin/tail not  exist.");
    }

    sleep(5);
    $tail_pid = open($fh,"/usr/bin/tail -n 0 -F $conf{ACCESS_LOG} |") or die "$!";
----------
получил в логах:
Jan  5 10:15:16 moon squid2mysql: file /var/log/squid/access.log exist.
Jan  5 10:15:16 moon squid2mysql: file /usr/bin/tail exist.

Ответить | Правка | ^ к родителю #2 | Наверх | Cообщить модератору

4. "Почему так происходит? (Perl,fork,pipe,FreeBSD,rc.d)"  +/
Сообщение от GD on 05-Янв-11, 11:48 
>> пустой $conf{ACCESS_LOG} на момент старта скрипта?
> Нет. Не пустой. Проверял вот так:

вы проверяете наличие файла
а не его размер

>[оверквотинг удален]
>         syslog('NOTICE', "file /usr/bin/tail not
>  exist.");
>     }
>     sleep(5);
>     $tail_pid = open($fh,"/usr/bin/tail -n 0 -F $conf{ACCESS_LOG} |")
> or die "$!";
> ----------
> получил в логах:
> Jan  5 10:15:16 moon squid2mysql: file /var/log/squid/access.log exist.
> Jan  5 10:15:16 moon squid2mysql: file /usr/bin/tail exist.

Ответить | Правка | ^ к родителю #3 | Наверх | Cообщить модератору

5. "Почему так происходит? (Perl,fork,pipe,FreeBSD,rc.d)"  +/
Сообщение от yooo on 08-Янв-11, 11:17 
> вы проверяете наличие файла
> а не его размер

Простите я вас не сразу понял. Добавил строчки проверки размера файла:
-----------
if ( -z $conf{ACCESS_LOG} ){
        syslog('NOTICE', "file $conf{ACCESS_LOG} has zero size.");
    }else{
        syslog('NOTICE', "file $conf{ACCESS_LOG} has not zero size.");
    }

    if ( -e '/usr/bin/tail' ){
        syslog('NOTICE', "file /usr/bin/tail exist.");
    }else{
        syslog('NOTICE', "file /usr/bin/tail not  exist.");
    }

    #sleep(5);
    $tail_pid = open($fh,"/usr/bin/tail -n 0 -F $conf{ACCESS_LOG} |") or die "$!";
-----------

в логах получаю:
Jan  8 11:08:39 moon squid2mysql: file /var/log/squid/access.log has not zero size.
Jan  8 11:08:39 moon squid2mysql: file /usr/bin/tail exist.

P.S народ может есть еще идеи как отловить эту фичу, или хотябы как сделать алгоритм не зависищим от функции splee(5) ?

Ответить | Правка | ^ к родителю #4 | Наверх | Cообщить модератору

6. "Почему так происходит? (Perl,fork,pipe,FreeBSD,rc.d)"  +/
Сообщение от yooo on 12-Янв-11, 12:39 
Народ хотя бы направление куда копать подскажите плиз!


Ответить | Правка | ^ к родителю #5 | Наверх | Cообщить модератору

7. "Почему так происходит? (Perl,fork,pipe,FreeBSD,rc.d)"  +/
Сообщение от GD on 13-Янв-11, 15:34 
> Народ хотя бы направление куда копать подскажите плиз!

while ( <$fh> ){

Ответить | Правка | ^ к родителю #6 | Наверх | Cообщить модератору

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

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




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

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