在另一个Perl脚本中执行Perl脚本并将其输出重定向到文件中,应该怎么做?

3
我正在通过crontab运行一个perl脚本,并将其输出重定向到文件中:
30 1 * * * /full/path/to/my_script.pl >> /full/path/to/my_log_file

在my_script.pl中,我通过system()命令执行了几个其他的perl脚本:
#/usr/bin/env perl
system( "/full/path/to/another_script.pl" );

在这些脚本中,我使用“print”命令向标准输出流(STDOUT)写入内容:

#/usr/bin/env perl
print "Standard output...\n";

然而,似乎这些子脚本的输出都没有被重定向到我的日志文件——我只看到父perl脚本的输出。我是否遗漏了一些明显的东西?这是在Linux系统上。

2个回答

1

不要使用system(),请使用qx

print qx( "/full/path/to/another_script.pl" );

0

嗯,如果使用system(),那么标准输出应该最终回到您的日志中。

您有例子吗?

我的直接想法是,system()调用实际上并没有运行其他脚本 - 您是否使用了脚本的完整路径?请记住,cron将不具有与您的shell相同的$ PATH,因此可能找不到您要运行的脚本,除非它们具有完整的路径。

您还可以在日志中捕获STDERR: 30 1 * * * /my_script.pl 2>&1 >> my_log_file


有趣,使用“@>&1”技术会将STDOUT和STDERR捕获到my_log_file中吗?是的,我在crontab中对主脚本使用完整路径,并在系统()命令中使用子脚本的完整路径。 - todd412
我在我的原始帖子中添加了一些额外的细节。 - todd412
是的 - 2>&1会将文件句柄2(STDERR)重定向到文件句柄1(STDOUT)。然后使用>>(用于STDOUT),结果是STDOUT和STDERR输出都会被发送到您的日志文件。 - pgregg
#/usr/bin/env perl <--- Perl在cron的PATH中吗?虽然我期望如果它在父进程中工作,那么它也会在子脚本中工作。 - pgregg
其他需要检查的事项:system() 的返回值 - 应该为0。尝试使用反引号 $output = /full/path/to/another_script.pl; print $output;(好吧 - 我不知道如何使其显示单个反引号,因为那是“代码”的标记),并捕获错误。eval { system(" .. "); }; if ($@) { print "ERROR: $@\n"; } - pgregg

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接