热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Perl脚本记录外部可执行文件输出和错误,但仍然运行

如何解决《Perl脚本记录外部可执行文件输出和错误,但仍然运行》经验,为你挑选了1个好方法。

我有一个Perl脚本,它运行一个外部可执行文件.该可执行文件运行一段时间(有时是秒,有时是一小时),可以将文本吐出到STDOUT和STDERR以及退出代码,这些都是必需的.下面的代码演示了第一个成功的外部可执行文件运行(带有一行的小bash脚本 - 注释),然后出现状态不佳(例如gs - ghostscript).我希望外部可执行文件将其STDOUT提供给Perl脚本,以便在外部仍在执行时记录到日志文件(也用于其他内容)之前进行评估,过滤,格式化等.STDERR也可以以同样的方式工作.此脚本可用于记录STDOUT中的所有内容,但仅在可执行文件完成后才能记录.并且STDERR只是直接记录,没有评估等.我没有可能安装任何额外的Perl部件,模块等.

我如何让Perl脚本从可执行文件中获取每一行(STDOUT + STDERR),同时将其吐出(不仅仅是在结尾)以及出于其他目的的退出代码?

#!/usr/bin/perl
@array_executable_and_parameters = "/home/username/perl/myexecutable.sh" ; #ls -lh ; for i in {1..5}; do echo X; sleep 1; done
@array_executable_and_parameters2= "gs aaa" ;
my $line;
chdir("/home/username/perl/");
$logFileName = "logfileforsomespecificinput.log";
open(LOGHANDLE, ">>$logFileName" );
open (STDERR, '>>', $logFileName);                  #Prints to logfile directly
#open (STDERR, '>>', );                 #Prints to own STDOUT (screen or mailfile)

print LOGHANDLE "--------------OK run\n";
open CMD, '-|', @array_executable_and_parameters or die $@;
while (defined($line = )) {                    #Logs all at once at end
    print LOGHANDLE "-----\$line=$line-----\n";
}
close CMD;
$returnCode1= $?>>8;
print LOGHANDLE "\$returnCode1=$returnCode1\n";

print LOGHANDLE "--------------BAD run\n";
open CMD2, '-|', @array_executable_and_parameters2 or die $@;
while (defined($line = )) {
    print LOGHANDLE "-----\$line=$line-----\n";
}
close CMD2;
$returnCode2= $?>>8;
print LOGHANDLE "\$returnCode2=$returnCode2\n";

close(LOGHANDLE);

拿2.在评论中提出好建议后我尝试了IPC :: Run.但是仍然没有按预期工作.我似乎错过了从开始(或泵?)到完成的循环如何工作,以及当我不知道最后的输出是什么时如何让它迭代 - 正如各处提到的例子.到目前为止,我现在有以下代码,但它不能逐行工作.它一次性吐出文件列表,然后等待外部循环完全打开以打印出所有X. 我如何根据最初的需求来驯服它?

#! /usr/bin/perl
use IPC::Run qw( start pump finish );

@array_executable_and_parameters = ();
push(@array_executable_and_parameters,"/home/username/perl/myexecutable.sh"); #ls -lh ; for i in {1..5}; do echo X; sleep 1; done
my $h = start \@array_executable_and_parameters, \undef, \$out, \$err ;
pump $h;# while ($out or $err);
print "1A. \$out: $out\n";
print "1A. \$err: $err\n";
$out = "";
$err = "";
finish $h or die "Command returned:\n\$?=$?\n\$@=$@\nKilled by=".( $? & 0x7F )."\nExit code=".( $? >> 8 )."\n" ;
print "1B. \$out: $out\n";
print "1B. \$err: $err\n";

Hynek -Pichi.. 6

看看IPC模块,特别是IPC :: Cmd,IPC :: Run,如果不满意,那么IPC :: Run3.您需要涵盖很多细节,这些模块将使您的生活更轻松.



1> Hynek -Pichi..:

看看IPC模块,特别是IPC :: Cmd,IPC :: Run,如果不满意,那么IPC :: Run3.您需要涵盖很多细节,这些模块将使您的生活更轻松.


虽然我同意通过包含一个简单的例子,这个答案会更有用,但是请注意,链接是针对推荐解决问题的模块的实际文档,而不是一些短暂的博客文章等.metacpan改变或消失的可能性要大得多*.
@uldics你的意思是比重新发明轮子更简单?如果你知道`打开我的$ fh,' - |',...`内部只是对`pipe()`,`fork()`,`close()`,`dup()的一堆调用. ,`execl()`或`execve()`等等,你不必问.但是你要求最好的建议就是坚持使用推荐的模块.这不是一个简单的任务,也不是一个令人讨厌的错误的机会.
推荐阅读
author-avatar
时尚经典语录覀---
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有