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

Исходное сообщение
"Как завершить порожденный из open() процесс tail -F?"

Отправлено dodger , 29-Окт-05 21:34 
Ситуация:
Из 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()? Или можно решить проблему по другому?


Содержание

Сообщения в этом обсуждении
"Как завершить порожденный из open() процесс tail -F?"
Отправлено dmitri , 30-Окт-05 00:19 
>Ситуация:
>Из 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 = <> ){.....}


"Как завершить порожденный из open() процесс tail -F?"
Отправлено dodger , 31-Окт-05 07:36 
>Это не рационально, я сделал так:
>в syslog.conf
>ftp.*     | exec  /path_to/my_prog.pl
>
>данные в $a т.е. while ($a = <> ){.....}

Прошу прощения, но разве является рациональным безусловное перенаправление STDOUT и STDIN из скрипта в /dev/null и запуск отдельного (!) процесса для каждой строки журнала? man syslog.conf
+ процесс запускается с правами syslogd (догадаемся, что это за привелегии)


"Как завершить порожденный из open() процесс tail -F?"
Отправлено gr , 30-Окт-05 15:18 
>Ситуация:
>Из 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;

И вообще почитать учебник.


"Как завершить порожденный из open() процесс tail -F?"
Отправлено dodger , 31-Окт-05 07:40 
>Можно. Например написать правильно
>
>$SIG{'TERM'} = \&self_destroy;
>
>И вообще почитать учебник.

И каким образом мне поможет поместить в хэш ссылку на функцию вместо имени? Это поможет в случае с цепляемыми модулями (в этом самом учебнике написано), а не в моем.

ЗЫ: Проблема решилась чтением документации. open возвращает PID, если открывается pipe.

Всем спасибо за восклицания RTFM! в разной форме, и навязывание своего мнения :) Вряд ли я когда нибудь буду сюда что-либо помещать.


"Как завершить порожденный из open() процесс tail -F?"
Отправлено mthawk , 31-Окт-05 15:45 
>Ситуация:
>Из 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


"Как завершить порожденный из open() процесс tail -F?"
Отправлено dodger , 01-Ноя-05 05:38 
>Если нужно завершить принудительно в произвольный момент времени, то безусловно написать обработчик
>сигнала SIGTERM или SIGHUP
>А если нужно, что бы скрипт перестал тейлить напричер через N минут
>
>Почитать про функцию alarm
>#perldoc -f alarm
:) Наверное я все таки сам туплю. Ну не может же быть так, что 3 человека меня неправильно поняли.