#!/usr/bin/perl
use Foo.pm # no such file
然后由 cron 运行,脚本会出现消息“无法在 @INC 中找到 Foo.pm”。是真的。但是我看不到这条消息(服务器和 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>&1
或2>/some/file
.
如果这不可能,您可以STDERR
在加载模块之前在脚本的开头重新定义。在任何可能失败的语句之前使用BEGIN
块:use
#! perl
BEGIN {
open STDERR, '>', '/my/log/file';
}
use ModuleNotFound;