Вообшем вопрос следующий: есть 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>) принимает значение ЛОЖЬ. Народ объясните почему так происходит.
-- еще одно наблюдение ---
Методом тыка выяснил, что если перед функцией open() поставить функцию sleep(5), то проблема исчезает.P.S Плиз объясните почему так происходит.
> -- еще одно наблюдение ---
> Методом тыка выяснил, что если перед функцией open() поставить функцию sleep(5), то
> проблема исчезает.
> P.S Плиз объясните почему так происходит.пустой $conf{ACCESS_LOG} на момент старта скрипта?
> пустой $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.
>> пустой $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.
> вы проверяете наличие файла
> а не его размерПростите я вас не сразу понял. Добавил строчки проверки размера файла:
-----------
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) ?
Народ хотя бы направление куда копать подскажите плиз!
> Народ хотя бы направление куда копать подскажите плиз!while ( <$fh> ){