URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 8983
[ Назад ]

Исходное сообщение
"Почему так происходит? (Perl,fork,pipe,FreeBSD,rc.d)"

Отправлено yooo , 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>) принимает значение ЛОЖЬ. Народ объясните почему так происходит.



Содержание

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

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


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

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


"Почему так происходит? (Perl,fork,pipe,FreeBSD,rc.d)"
Отправлено yooo , 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.


"Почему так происходит? (Perl,fork,pipe,FreeBSD,rc.d)"
Отправлено GD , 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.


"Почему так происходит? (Perl,fork,pipe,FreeBSD,rc.d)"
Отправлено yooo , 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) ?


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



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

while ( <$fh> ){