Я пытаюсь написать программу, фактически демона, который остается в памяти и выполняет что-то вроде 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.
http: // superuser.com/q/276909/416314 – serenesat
Вам нужно либо игнорировать сигналы SIGCHLD (поэтому ваши дочерние процессы не станут зомби), либо вам нужно использовать 'waitpid()' или эквивалент с опцией WNOHANG для очистки всех детей, которые завершено. Или, возможно, вам нужно иметь дочернюю вилку перед выполнением, а родитель ждет, пока ребенок умрет, а внук наследуется процессом init, который в основном сидит, ожидая, пока дети других процессов умрут. Каким-то образом вы должны убедиться, что ваши мертвые надлежащим образом похоронены; вещи становятся беспорядочными, если вы этого не сделаете, и система не позволит играть, если вы не очистите свой беспорядок. –