重定向&;无法'找到xxx.@INC"消息到文件


#!/usr/bin/perl
use Foo.pm # no such file

然后由cron运行,脚本出现"无法定位Foo"的消息。@INC"。这是真的。但是我看不到这个消息(服务器和cron记录不在我的控制范围内),也无法检测到丢失的文件。

是否有办法将此错误消息重定向到日志文件?STDERR重定向不工作,因为错误在编译时发生

我刚刚测试过,下面的解决方案确实有效:

./test.pl &> log
cat log
Can't locate Foo.pm in @INC (@INC contains: /etc/perl /usr/local/lib/perl/5.10.1 
/usr/local/share/perl/5.10.1 /usr/lib/perl5 /usr/share/perl5 /usr/lib/perl/5.10
/usr/share/perl/5.10 /usr/local/lib/site_perl .) at ./test.pl line 2.
BEGIN failed--compilation aborted at ./test.pl line 2.
# perl -e 'use foo;' >  /var/log/messages 2>&1
# tail /var/log/messages
Can't locate foo.pm in @INC (@INC contains: /etc/perl /usr/local/lib/perl/5.10.1 /usr/local/share/perl/5.10.1 /usr/lib/perl5 /usr/share/perl5 /usr/lib/perl/5.10 /usr/share/perl/5.10 /usr/local/lib/site_perl .) at -e line 1.
BEGIN failed--compilation aborted at -e line 1.
# 

如果可以修改cron条目,则将标准错误重定向到标准输出或标记为2>&12>/some/file的文件。

如果不可能,您可以在加载模块之前在脚本的开始处重新定义STDERR。在任何可能失败的use语句之前使用BEGIN:

#! perl
BEGIN {
    open STDERR, '>', '/my/log/file';
}
use ModuleNotFound;

相关内容

最新更新