【发布时间】:2018-06-04 04:07:18
【问题描述】:
对 Perl 相当陌生。 我在 Linux 机器上有一个 Perl 脚本,它有自己的日志文件。日志文件名称可以更改,具体取决于脚本正在处理的数据(日期、文件名、数据类型等)
某些节点的脚本正在使用 system() 调用调用本机可执行文件,这会将一些信息提供给 STDOUT 和 STDERR - 在几分钟内几十到几百行。可执行文件完成后,脚本继续并将一些其他信息记录到日志文件中。
到目前为止,脚本只记录了它自己的输出,没有本机可执行文件输出,我想登录与 Perl 脚本登录的相同文件。尝试了以下两种方法:
#!/usr/bin/perl
#some other code
@array_executable_and_parameters = qw/echo foo/ ;
open $log_fh, '>>', 'log/logfile1.txt';
*STDOUT = $log_fh;
*STDERR = $log_fh;
print "log_fh=$log_fh\n";
system( @array_executable_and_parameters);
$logfilename='log/logfile2.txt';
open(LOGFILEHANDLE, ">>$logfilename" );
*STDOUT = LOGFILEHANDLE;
*STDERR = LOGFILEHANDLE;
print LOGFILEHANDLE "Somethinglogged\n";
system( @array_executable_and_parameters);
它在我手动运行脚本时有效,但在从 cron 运行时无效。
我知道可以通过 Linux 方式在 crontab 中重定向,但是我必须知道要登录的文件名,只有在一些数据到达时才会知道,所以在我看来是不可行的。我也希望尽可能多地包含在脚本中,而不需要对 Linux 等有太多依赖。我也无法安装任何额外的模块、Perl 使用的库,假设它是最低限度的安装。
如何从 Perl 脚本中将 STDOUT 和 STDERR 重定向到特定文件?
如果可能,我如何检测 STDOUT 当前所在的文件名?
【问题讨论】:
-
这个 Perl 脚本是如何被调用的,你是如何调用
system()的? -
来自 crontab:* * * * * /home/username/perl/myscript.pl 手动:./home/username/perl/myscript.pl 从脚本内部调用可执行文件,例如:system( @array_executable_and_parameters);
-
您的交互式示例在
/home之前有一个点,因此除非您在根目录中,否则它们是不等价的;但我认为这是一个虚假的细节。您能否在演示脚本中通过简单的system()调用来edit 提出您的问题,但未能达到您的预期? -
感谢您的编辑,我们仍然需要一个很好的例子来说明数组中的内容,以使其成为正确的minimal reproducible example。