The OpenNET Project / Index page

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

форумы  помощь  поиск  регистрация  майллист  ВХОД  слежка  RSS
"Как завершить порожденный из open() процесс tail -F?"
Вариант для распечатки  
Пред. тема | След. тема 
Форумы Программирование под UNIX (Public)
Изначальное сообщение [Проследить за развитием треда]

"Как завершить порожденный из open() процесс tail -F?" 
Сообщение от dodger emailИскать по авторуВ закладки(ok) on 29-Окт-05, 21:34  (MSK)
Ситуация:
Из 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()? Или можно решить проблему по другому?

  Правка | Высказать мнение | Ответить | Рекомендовать в FAQ | Cообщить модератору | Наверх

 Оглавление

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

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

  Удалить Правка | Высказать мнение | Ответить | Рекомендовать в FAQ | Cообщить модератору | Наверх

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

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

  Удалить Правка | Высказать мнение | Ответить | Рекомендовать в FAQ | Cообщить модератору | Наверх

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

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

  Удалить Правка | Высказать мнение | Ответить | Рекомендовать в FAQ | Cообщить модератору | Наверх

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

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

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

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

  Удалить Правка | Высказать мнение | Ответить | Рекомендовать в FAQ | Cообщить модератору | Наверх

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

  Удалить Правка | Высказать мнение | Ответить | Рекомендовать в FAQ | Cообщить модератору | Наверх

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


  Удалить Правка | Высказать мнение | Ответить | Рекомендовать в FAQ | Cообщить модератору | Наверх


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

Индекс форумов | Темы | Пред. тема | След. тема
Оцените тред (1=ужас, 5=супер)? [ 1 | 2 | 3 | 4 | 5 ]
Пожалуйста, прежде чем написать сообщение, ознакомьтесь с данными рекомендациями.




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

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