从Cron运行时,Perl Script不会输出文件



perl的新事物。我在Linux计算机上有一个Perl脚本,该脚本具有自己的日志文件。logfile名称可以更改,取决于脚本正在使用的数据(日期,文件名,数据类型等)

某些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_fhn";
system( @array_executable_and_parameters);
$logfilename='log/logfile2.txt';
open(LOGFILEHANDLE, ">>$logfilename" );
*STDOUT = LOGFILEHANDLE;
*STDERR = LOGFILEHANDLE;
print LOGFILEHANDLE "Somethingloggedn";
system( @array_executable_and_parameters);

手动运行脚本时,它可以工作,但是从cron运行时不行。

我知道有可能通过Linux Menux重定向在crontab中,但后来我必须知道要登录的文件名,只有在某些数据到达时才会知道,因此在我看来似乎是不可行的。我也希望在脚本内部尽可能多地拥有Linux等的许多依赖项等。我也不可能安装任何额外的模块,perl库要使用,假设它是裸露的最低安装。

如何从perl脚本内部将Stdout和stderr重定向到特定文件?

,如果可能的话,如何检测filename stdout当前转到?

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

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

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

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

最新更新