从cron运行时,Perl脚本不会将STDOUT输出到文件

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了从cron运行时,Perl脚本不会将STDOUT输出到文件相关的知识,希望对你有一定的参考价值。

相当新的Perl。我在Linux机器上有一个Perl脚本,它有自己的日志文件。日志文件名称可以更改,具体取决于脚本正在处理的数据(日期,文件名,数据类型等)

某些pionts的脚本使用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
";
system( @array_executable_and_parameters);

$logfilename='log/logfile2.txt';
open(LOGFILEHANDLE, ">>$logfilename" );
*STDOUT = LOGFILEHANDLE;
*STDERR = LOGFILEHANDLE;
print LOGFILEHANDLE "Somethinglogged
";
system( @array_executable_and_parameters);

它在我手动运行脚本时有效,但在从cron运行时则无效。

我知道可以通过Linux方式在crontab中重定向,但是我必须知道要登录的文件名,只有当某些数据到达时才会知道,所以在我看来这是不可行的。我也想尽可能多地在脚本中,没有很多依赖Linux等。我也没有可能安装任何额外的模块,Perl使用的库,假设它是最小的安装。

如何将STDOUT和STDERR从Perl脚本内部重定向到特定文件?

如果可能的话,我如何检测当前STDOUT的文件名?

答案

重新分配*STDOUT只影响Perl内部STDOUT标量的绑定。在系统级别重定向标准输出的正确方法是这样的

open (STDOUT, '>&', $log_fh) or die "$0: could not: $!";

您应该类似地报告可能失败的其他系统调用的错误(以及use strict等)。

cron在您的主目录中运行您的工作,因此如果路径$HOME/log不存在,脚本将无法打开日志文件句柄(默默地,因为您没有记录open错误!)

以上是关于从cron运行时,Perl脚本不会将STDOUT输出到文件的主要内容,如果未能解决你的问题,请参考以下文章

从 Perl 脚本运行 PHP

Perl 脚本中的 CRUD cron 条目

手动运行脚本与在 cron 中运行

Ruby脚本在cron运行时抛出错误,但在用户运行时不会

Cron 使用 STDERR 但不是 STDOUT 发送电子邮件?

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