2009-04-23 6 views
5

필자는 perl 스크립트 (XMLTV "grabbers"계열의 일부, 특히 tv_grab_oztivo)를 가지고 있습니다.커맨드 라인이 cron에서 실행되지 않는 이유는 무엇입니까?

나는 성공적으로 다음과 같이 실행할 수 있습니다 :

/sw/bin/perl /path/to/tv_grab_oztivo --output /path/to/tv.xml 

나는 작업 디렉터리에 문제를 제거하기 위해 모든의 전체 경로를 사용합니다. 권한이 문제가되어서는 안됩니다.

터미널 (Mac OSX)에서 실행하면 잘 작동합니다.

하지만 cron 작업을 통해 실행되도록 설정하면 아무 일도 일어나지 않습니다. 출력이 생성되지 않습니다.

실제로 볼 수있는 한 crontab에는 아무런 문제가 없습니다. 왜냐하면 필자가 helloworld.pl을 실제 스크립트로 대체하면 올바른 시점에 정상적으로 실행되기 때문입니다.

그래서 디버깅을하려면 어떻게해야합니까? 나는 환경이 매우 다르다는 두 가지 경우에서 %ENV을 볼 수 있지만 디버깅에 다른 접근법을 사용할 수 있습니까? 쉘에서 어떤 종류의 perl "die"메시지 또는 "not found"메시지 일 수있는 cron 작업의 결과를 어떻게 볼 수 있습니까?

아니면 내가 어떻게 든 명령의 크론 버전이 나로 실행중인 때와 동일한 환경을 제공하기 위해 노력 하는가?

답변

8

종종을합니다.

(/sw/bin/perl /path/to/tv_grab_oztivo ...) >/tmp/qq 2>&1 

다음 /tmp/qq를 보라 : 가장 좋은 방법은 명령을 사용하여 OUPUT을 캡처하는 것입니다. 이 누락 된 환경을 것으로 판명 않는 경우

, 당신은 둘 필요가 있습니다

. ~/.profile 

또는 같은 cron 작업의 실행 체인에 비슷한, :

(. ~/.profile ; /sw/bin/perl /path/to/tv_grab_oztivo ...) >/tmp/qq 2>&1 
+0

작동 중입니다. 고맙습니다. 결국 나는 $ ENV에 PERL5LIB와 PATH를 추가했고 모두 잘 돌아갔다. – AmbroseChapel

-1

cron 보통은 crontab 소유자 표준 출력과 표준 에러 전자 mailes 모든 출력의 출력을 캡처한다.

당신이 유효이고 적절한 시간에 실행됩니다 있는지 확인하기 위해 crontab 항목을 다시 한 번 확인 했습니까?

스크립트에 환경 변수가 설정되어 있지 않은지 확인하십시오. 그렇지 않으면 다른 스크립트가 기대하는 환경 변수를 설정할 수있는 다른 (bash) 스크립트로 랩핑하십시오. 크론에서 실행할 때 전체 환경을하지 않기 때문에

+0

"crontab 항목을 다시 확인하여 유효한지, 적시에 실행합니까?" -- 예. 나는 그렇게 말했다. – AmbroseChapel

+0

신경 쓰지 마라. 나는 단지 두 번 확인하고 싶었다. crontab 문법은 까다 롭고 잘못 이해하기 쉽습니다. – lothar

+0

cron 출력을 메일로 보내지 않으면 crontab 맨 위에있는 [email protected]을 사용하여 출력 대상을 변경할 수 있습니다. 지역 우편물이 작동하는지 확인하십시오. – preaction

3

두 가지 경우에 % ENV를보고 있다면 펄 스크립트의 첫 단계로 % ENV를 cron 작업의 내용으로 설정 한 다음 명령 행. 당신이 (필요한 경우 펄 -d에서 실행 포함)를 디버깅하기 위해 할 수있는 일이 있다면 지금

BEGIN { 
    if (exists $ENV{something_in_your_env_not_in_cron}) { 
    %ENV = (...); 
    exec $^X, $0, @ARGV; 
    } 
} 

그것을 실행하려고하고, 보는이 전체를 제어 할 수 있도록 한 번 자신을 간부 인해야 할 수도 있습니다.대부분의 경우, 마침내 작동하기 시작할 때까지 한 번에 하나씩 항목을 % ENV에 다시 추가하게됩니다 (LD_LIBRARY_PATH가이 작업에 적합하지만 ORACLE_HOME 또는 Oracle 또는 DB2 응용 프로그램 용 DB2HOME도 좋은 선택 일 수 있음)). 그런 다음 스크립트 또는 crontab에 변수를 설정할 수 있습니다.

+1

도움을 주셔서 감사합니다. Pax와 정말 동등합니다. 그러나 단 하나만 답변 드릴 수 있습니다. 죄송합니다. – AmbroseChapel

0

나는 cron 명령에서 절대 경로로 간단한 쉘 스크립트를 실행했다. 그 스크립트 안에서, 나는 stdout과 stderr을 알려진 (또는 알만한) 파일에 덫을 놓았다. 나는 또한 당신의 환경이 충분히 설정되어 있는지 확인하고자한다. 유닉스에서, 당신은 cron을 통해 명령을 실행할 때 환경 설정이 거의 없다. MacOS X에 대해서는 잘 모르겠다. 문제의 표준 범인은 PATH이다. 나는 보통 내가 문제가되지 않는 충분한 작업 환경을 설정하는 별도의 .cronfile을 가지고있다. 이것은 .profile의 아날로그이다.

0

경우에 따라 명령 줄에 어떤 문제가 있는지 알 수없는 경우이를 해결할 수있는 가장 간단한 방법은 모든 것을 셸 스크립트로 바꾸는 것입니다. 이상적으로는 이 없어야하지만, 문제를 해결하는 가장 빠른 방법 일 수 있습니다.

파일 : 크론에 /files/cron1.sh

#!/bin/sh 
/sw/bin/perl /path/to/tv_grab_oztivo --output /path/to/tv.xml 

그리고는 :

/files/cron1.sh 

이는 크론의 독립적 인 스크립트를 테스트 할 수 있습니다. 로그인 쉘은 cron과 다른 환경 변수로 실행됩니다.

관련 문제