Perl: хвостовой файл в фоновом режиме при выполнении другой системной команды в цикле - PullRequest
1 голос
/ 04 ноября 2011

Я пытаюсь написать Perl-скрипт для захвата вывода системного журнала, пока цикл запускает системную команду через определенные промежутки времени. Я хочу, чтобы скрипт выполнял действие, аналогичное тому, что я часто делаю в командной строке (unix): получение дампов потоков процесса Java путем включения /var/log/jbossas/default/console.log в новый файл в фоновом режиме и одновременное выполнение kill -QUIT [PID] произвольное число интервалы, на переднем плане. Мне не нужно проверять или обрабатывать вывод файла журнала, пока он хвост, я просто хочу, чтобы он переходил к новому файлу во время выполнения моего цикла; как только цикл завершится, фоновая задача также должна выйти.

# basic loop
# $process is PID given as argument 
my $duration = 6;
my $dumps = 0;
until ($dumps == $duration) {
      system "kill -QUIT $process";
      $dumps++;
      print STDOUT "$dumps of $duration thread dumps sent to log.\n";
      print STDOUT "sleeping for $frequency seconds\n";
      sleep 30;
}

Каким-то образом мне нужно обернуть этот цикл в другой цикл, который будет знать, когда он выйдет, а затем выйти из задачи хвостовой обработки фонового журнала. Я понимаю, что это должно быть тривиально в Perl, но я не уверен, как поступить, и другие вопросы или примеры, которые я нашел, не совсем соответствуют тому, что я пытаюсь сделать здесь. Похоже, использование Perl system блокирует мой переход во внутренний цикл; exec разветвляется с заданием на хвост, так что я не уверен, как выйти из него после выполнения внутреннего цикла. Я бы предпочел использовать только основные модули Perl, а не File :: Tail или какие-либо дополнительные модули CPAN.
Заранее благодарен за любые отзывы, и не стесняйтесь издеваться над моим Perlessness. Я искал похожие вопросы, на которые здесь даны ответы, но если я пропустил тот, который, кажется, решает мою проблему, я был бы признателен, если бы вы связали меня с ним.

1 Ответ

1 голос
/ 04 ноября 2011

Это, вероятно, лучше всего подходит для цикла событий.Прочтите ответ на Создание демона Perl, который работает 24/7 и читает из именованных каналов , что даст вам введение в чтение дескриптора файла в цикле событий.Просто откройте канал к выходу хвоста, распечатайте его в файл, запустите уничтожение события таймера, а затем, когда события таймера завершатся, просто сигнализируют о выходе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...