2015-11-19 9 views
-1

Я пытаюсь написать программу, фактически демона, который остается в памяти и выполняет что-то вроде tail -F в быстро обновляемом файле журнала. Затем программа, обнаруживая новую строку в файле, должна запустить другой скомпилированный скрипт perl, который будет выполнять некоторые операции в строке журнала, а затем отправить его с сообщением.Демон, чтобы зачеркнуть лог и вилку множественного внешнего (perl) скрипта

Чтобы четко объяснить, я буду называть эти две программы «prgTAIL» и «prgPROCESS». Итак, prgTAIL завершает журнал и запускает prgPROCESS, передавая ему новую строку.

Очевидно, что prgTAIL не должен ждать завершения процедуры prgPROCESS, так как prgTAIL должен оставаться в памяти и продолжать обнаруживать новую строку в журнале. Кроме того, для обновления файла необходимо запустить несколько параллельных экземпляров prgPROCESS. По этой причине я использую две программы: первые маленькие и быстрые просто передают данные ко второму, что может быть более тяжелым, потому что его можно запустить в нескольких экземплярах.

На prgTAIL я использовал:

труба к хвосту файл журнала

петля, а для запуска prgPROCESS на новой строке журнала

вилкой(); для продолжения без ожидания prgPROCESS концы

my $log_csv = "/log/csv.csv"; 
open (my $pipe, "-|", "tail", "-n0", "-F", $log_csv) or die "error"; 
while (<$pipe>) { 
    $line = $_ ; 
    my $pid = fork(); 
    if (defined $pid && $pid == 0) { 
     exec("/bin/prgPROCESS ".$line) ; # I tried system() too. 
     exit 0; 
    } 
} 

Операция prgPROCESS не так важна; в любом случае .. он анализирует строку $, переданную как аргументы, строит XML и затем публикует его через https.

Итак, этот материал действительно работает, но я думаю, что я что-то испортил с процессом, потому что, когда количество новых строк и prgPROCESS достигает 550, prgTAIL продолжает работать, но он больше не может вызывать prgPROCESS, слишком много процессов. Я получаю эту ошибку при bash:

-bash: fork: Resource temporarily unavailable 

Что случилось? Есть идеи? Может быть, процессы prgPROCESS не заканчиваются и остаются застрявшими, не освобождая место для другого процесса?

PS: Сейчас я использую Mac OS X, но это будет работать в Linux.

+0

http: // superuser.com/q/276909/416314 – serenesat

+1

Вам нужно либо игнорировать сигналы SIGCHLD (поэтому ваши дочерние процессы не станут зомби), либо вам нужно использовать 'waitpid()' или эквивалент с опцией WNOHANG для очистки всех детей, которые завершено. Или, возможно, вам нужно иметь дочернюю вилку перед выполнением, а родитель ждет, пока ребенок умрет, а внук наследуется процессом init, который в основном сидит, ожидая, пока дети других процессов умрут. Каким-то образом вы должны убедиться, что ваши мертвые надлежащим образом похоронены; вещи становятся беспорядочными, если вы этого не сделаете, и система не позволит играть, если вы не очистите свой беспорядок. –

ответ

0

Ваша задача заключается в следующем:

while() { 

не имеет каких-либо условие ограничения, так что это просто спиннинг так быстро, как это возможно. Вы никогда не читаете на своем канале, вы просто так быстро разворачиваете, и можете создать этот новый скрипт.

Вы может быть желание:

while (my $line = <$pipe>) { 

    #.... 
} 

Но на самом деле - это можно утверждать, что вы на самом деле не нужно раскошелиться на всех, потому что чтение/процесс/чтение цикла будет, вероятно, делать только штраф - fork() и exec() - это в основном то, что система уже делает.

Вы также должны - если forking - очистить дочерние процессы. Это не имеет большого значения для коротких вещей, но вещи, которые сидят в цикле, оставят много процессов зомби. Либо установите значение $SIG{CHLD}, либо используя waitpid.

+0

Ты прав. На самом деле, я забыл написать условие в посте .. Реальный кода имеет условие: в то время как (<$pipe>) Я починю оригинальный пост, извините .. я использовал вилку держать исполнение (prgTAIL), не дожидаясь завершения подчиненной программы (prgPROCESS). Я думаю, что проблема связана с процессом зомби. Я проведу код с помощью $ SIG {CHLD} или что-то в этом роде, «мои мертвые будут надлежащим образом похоронены», и я дам вам знать. Благодаря! – Chrome