运行外部命令并并行处理其日志文件

时间:2011-12-22 17:19:55

标签: perl unix ipc fork

我需要在Perl代码中运行外部工具。此命令工作很长时间,几乎不打印任何STDOUT,但创建一个日志文件。 我想运行它并行并行读取和处理其日志文件。我怎么能在Perl中做到这一点?

提前致谢。

1 个答案:

答案 0 :(得分:2)

如果使用类似File::Tail的内容来读取日志文件,则可以执行简单的forkexec来运行外部命令。以下内容应该有效:

use strict;
use warnings;

use File::Tail;

my $pid = fork;

if ( $pid ) { 
    # in the parent process; open the log file and wait for input
    my $tail = File::Tail->new( '/path/to/logfile.log' );
    while( my $line = $tail->read ) { 
        # do stuff with $line here
        last if $line eq 'done running';  # we need something to escape the loop 
                                          # or it will wait forever for input.
    }
} else { 
    # in the child process, run the external command
    exec 'some_command', 'arg1', 'arg2';
}

# wait for child process to exit and clean it up
my $exit_pid = wait;

如果运行子进程时出现问题,则退出返回代码将在特殊变量$?中;有关详细信息,请参阅wait的文档。

此外,如果日志记录输出没有提供何时停止拖尾文件的线索,您可以在$SIG{CHLD}中安装一个处理程序,它将捕获子进程的终止信号并允许您突破循环