2013-05-15 1 views
0
#!/usr/bin/perl 
use Foo.pm # no such file 

그런 다음 cron으로 실행하면 "@INC에서 Foo.pm을 찾을 수 없습니다"라는 메시지가 스크립트에 표시됩니다. 그건 진실이야. 그러나이 메시지 (서버 및 cron 레코드가 내 제어에서 제외됨)를 볼 수없고 어떤 파일이 누락되었는지 감지 할 수 없습니다.리디렉션 "@INC에서 @xx.pm의 위치를 ​​찾을 수 없습니다"메시지

이 오류 메시지를 로그 파일로 리디렉션 할 수있는 방법이 있습니까? 오류가 컴파일 시간에 진행되기 때문에 STDERR 리디렉션이 작동하지 않습니다

+1

가 'Foo.pm'을 사용하기 전에 STDERR을'BEGIN' 블록으로 리디렉션하십시오. – Oktalist

답변

1

난 그냥 테스트 다음과 같은 솔루션은 작업을 수행합니다 당신은 cron 항목을 수정할 수 있습니다 경우에 표준 오류 리디렉션

./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. 
0
# 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. 
# 
0

표준 출력 또는 표기가 2>&1 또는 2>/some/file 인 파일로 변환하십시오.

모듈을로드하기 전에 이것이 가능하지 않으면 스크립트 시작 부분에 STDERR을 다시 정의 할 수 있습니다. 그 실패 할 수 있습니다 어떤 use 문 앞에 BEGIN 블록 을 사용하십시오. "오류가 컴파일시에 예정되어 있기 때문에 STDERR 리디렉션이 작동하지 않습니다"

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

@Oktalist가 이미이 제안을 한 것으로 보입니다. – mob