我需要在Perl代码中运行外部工具。此命令工作很长时间,几乎不打印任何STDOUT,但创建一个日志文件。 我想运行它并行并行读取和处理其日志文件。我怎么能在Perl中做到这一点?
提前致谢。
答案 0 :(得分:2)
如果使用类似File::Tail的内容来读取日志文件,则可以执行简单的fork
和exec
来运行外部命令。以下内容应该有效:
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}
中安装一个处理程序,它将捕获子进程的终止信号并允许您突破循环