gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:33:24 26 4
gpt4 key购买 nike

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

某些部分的脚本正在调用带有 system() 调用的 native 可执行文件,这会向 STDOUT 和 STDERR 提供一些信息 - 在许多分钟内只有几十到几百行。可执行文件完成后,脚本继续并将一些其他信息记录到日志文件中。

直到现在脚本只记录它自己的输出,没有 native 可执行文件输出,我想在与 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 当前转到的文件名?

最佳答案

重新分配 *STDOUT 只会影响 Perl 内部 STDOUT 标量的绑定(bind)。在系统级别重定向标准输出的正确方法类似于

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

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

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

关于linux - 从 cron 运行时,Perl 脚本不会将 STDOUT 输出到文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47925653/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com