Ситуация:
Из perl скрипта запускается процесс tail -F, натравленный на лог-файл таким способом:open (TAIL, "/usr/bin/tail -F -n 0 /var/log/messages|");
далее он в цикле
while (<TAIL>) {
обрабатывает каждую появляющуюся строку.
Прекращать работу все равно когда то приходится:
$SIG{TERM} = 'self_destroy';
sub self_destroy
{
close(TAIL) or warnlog("could not shutdown tail process! $!");
die("\n");
}SIGTERM посланный скрипту не приводит к завершению. Вместо этого скрипт висит вместе с tail процессом в ожидании.
SIGTERM процессу tail помогает, но close(TAIL) получает отрицательный результат, и скрипт с руганью таки отваливается.Возможно ли как нибудь получить PID процесса, порожденного с помощью open()? Или можно решить проблему по другому?
>Ситуация:
>Из perl скрипта запускается процесс tail -F, натравленный на лог-файл таким способом:
>
>
>open (TAIL, "/usr/bin/tail -F -n 0 /var/log/messages|");
>
>далее он в цикле
>
>while (<TAIL>) {
>
>обрабатывает каждую появляющуюся строку.
>
>Прекращать работу все равно когда то приходится:
>
>$SIG{TERM} = 'self_destroy';
>sub self_destroy
>{
> close(TAIL) or warnlog("could not
>shutdown tail process! $!");
> die("\n");
>}
>
>SIGTERM посланный скрипту не приводит к завершению. Вместо этого скрипт висит вместе
>с tail процессом в ожидании.
>SIGTERM процессу tail помогает, но close(TAIL) получает отрицательный результат, и скрипт с
>руганью таки отваливается.
>
>Возможно ли как нибудь получить PID процесса, порожденного с помощью open()? Или
>можно решить проблему по другому?
Это не рационально, я сделал так:
в syslog.conf
ftp.* | exec /path_to/my_prog.plданные в $a т.е. while ($a = <> ){.....}
>Это не рационально, я сделал так:
>в syslog.conf
>ftp.* | exec /path_to/my_prog.pl
>
>данные в $a т.е. while ($a = <> ){.....}Прошу прощения, но разве является рациональным безусловное перенаправление STDOUT и STDIN из скрипта в /dev/null и запуск отдельного (!) процесса для каждой строки журнала? man syslog.conf
+ процесс запускается с правами syslogd (догадаемся, что это за привелегии)
>Ситуация:
>Из perl скрипта запускается процесс tail -F, натравленный на лог-файл таким способом:
>
>
>open (TAIL, "/usr/bin/tail -F -n 0 /var/log/messages|");
>
>далее он в цикле
>
>while (<TAIL>) {
>
>обрабатывает каждую появляющуюся строку.
>
>Прекращать работу все равно когда то приходится:
>
>$SIG{TERM} = 'self_destroy';
>sub self_destroy
>{
> close(TAIL) or warnlog("could not
>shutdown tail process! $!");
> die("\n");
>}
>
>SIGTERM посланный скрипту не приводит к завершению. Вместо этого скрипт висит вместе
>с tail процессом в ожидании.
>SIGTERM процессу tail помогает, но close(TAIL) получает отрицательный результат, и скрипт с
>руганью таки отваливается.
>
>Возможно ли как нибудь получить PID процесса, порожденного с помощью open()? Или
>можно решить проблему по другому?
Можно. Например написать правильно$SIG{'TERM'} = \&self_destroy;
И вообще почитать учебник.
>Можно. Например написать правильно
>
>$SIG{'TERM'} = \&self_destroy;
>
>И вообще почитать учебник.И каким образом мне поможет поместить в хэш ссылку на функцию вместо имени? Это поможет в случае с цепляемыми модулями (в этом самом учебнике написано), а не в моем.
ЗЫ: Проблема решилась чтением документации. open возвращает PID, если открывается pipe.
Всем спасибо за восклицания RTFM! в разной форме, и навязывание своего мнения :) Вряд ли я когда нибудь буду сюда что-либо помещать.
>Ситуация:
>Из perl скрипта запускается процесс tail -F, натравленный на лог-файл таким способом:
>
>
>open (TAIL, "/usr/bin/tail -F -n 0 /var/log/messages|");
>
>далее он в цикле
>
>while (<TAIL>) {
>
>обрабатывает каждую появляющуюся строку.
>
>Прекращать работу все равно когда то приходится:
>
>$SIG{TERM} = 'self_destroy';
>sub self_destroy
>{
> close(TAIL) or warnlog("could not
>shutdown tail process! $!");
> die("\n");
>}
>
>SIGTERM посланный скрипту не приводит к завершению. Вместо этого скрипт висит вместе
>с tail процессом в ожидании.
>SIGTERM процессу tail помогает, но close(TAIL) получает отрицательный результат, и скрипт с
>руганью таки отваливается.
>
>Возможно ли как нибудь получить PID процесса, порожденного с помощью open()? Или
>можно решить проблему по другому?Если нужно завершить принудительно в произвольный момент времени, то безусловно написать обработчик сигнала SIGTERM или SIGHUP
А если нужно, что бы скрипт перестал тейлить напричер через N минут
Почитать про функцию alarm
#perldoc -f alarm
>Если нужно завершить принудительно в произвольный момент времени, то безусловно написать обработчик
>сигнала SIGTERM или SIGHUP
>А если нужно, что бы скрипт перестал тейлить напричер через N минут
>
>Почитать про функцию alarm
>#perldoc -f alarm
:) Наверное я все таки сам туплю. Ну не может же быть так, что 3 человека меня неправильно поняли.