2010-01-05 4 views
2

cron에서 shell sript가 포함 된 Perl 스크립트 (vas.pl)를 실행할 수 있습니까 (date.sh & backlog.sh)? 감사합니다. .cron에서 실행되는 Perl 스크립트에서 쉘 스크립트를 실행하려면 어떻게해야합니까?

0 19 * * * /opt/perl/bin/perl /reports/daily/scripts/vas_rpt/vasCIO.pl 2> /reports/daily/scripts/vas_rpt/vasCIO.err 

오류가 발생했습니다 :

date.sh: not found 
backlog.sh: not found 

펄 스크립트 :

#!/opt/perl/bin/perl 

system("sh date.sh"); 
open(FH,"/reports/daily/scripts/vas_rpt/date.txt"); 
@date = <FH>; 

close FH; 

open(FH,"/reports/daily/scripts/vas_rpt/$cat1.txt"); 
@array = <FH>; 

system("sh backlog.sh $date[0] $array[0]"); 

close FH; 

답변

2

그것은 가능합니다. cron에서 실행될 때 작업 디렉토리가 여러분이 생각하는대로되지 않을 수도 있음을 명심하십시오. 이것은 환경 변수의 값이거나/etc/passwd 파일에 지정된 값입니다. .shes에 대한 경로를 완전히 한정하는 것을 고려하십시오.

+0

또는 사용자와 PATH – Schwern

+0

덕분에 내가 경로를 포함하는 것을 잊었다 :-). 작동합니다! :-) – Cez

8

cron 현재 작업 디렉토리와 다른 작업 디렉토리에서 perl 스크립트를 실행합니다. 쉘 스크립트는 필요한 경우

use FindBin qw($Bin); 
system("sh $Bin/date.sh"); 

: 나는 당신이 CPAN에서 FindBin 패키지를 사용할 수 있습니다 생각처럼 END_LINK하면 관심있는 알레르기 경로를 하드 코딩하는 경우

# I'm assuming your shell script reside in the same 
# dir as your perl script: 

system("sh /reports/daily/scripts/date.sh"); 

을 또는 : 스크립트 파일의 전체 경로를 사용하여 올바른 경로로 시작하려면 작업 디렉토리를 먼저 변경하는 것이 좋습니다.

use FindBin qw($Bin); 
chdir $Bin; 
system("sh date.sh"); 
+0

이미 작동합니다. 감사합니다 :-) – Cez

+0

@slebetman : 실행중인 쉘 스크립트의 "home/start"디렉토리는 무엇입니까? 나는 약간의 파라노이드 인 것 같지만 거기에 'cd/reports/daily/scripts'가 있는지 확인하거나 스크립트가 절대 경로에 쓰는지 확인합니다. (그리고 솔루션과 대안에 대한 +1) – lexu

+0

@lexu : 네 말이 맞아. 쉘 스크립트를 시작하기 전에 현재 작업 디렉토리를 변경해야합니다. 그러나 OP가 단순히 전체 경로를 추가하는 것이 자신의 문제를 해결했다는 것을 언급 했으므로 자신의 경우에는 필요하지 않습니다. – slebetman

3

신중할 때까지 원하는대로 할 수 있습니다.

cron 작업에서 가장 먼저 기억해야 할 것은 환경 설정이 거의 없다는 것입니다.

현재 디렉토리는 / 또는 아마도 $HOME입니다. 그리고 $ PATH의 값은 최소입니다. 예를 들어 프로필이 실행되지 않았습니다.

올바른 디렉토리에 없으므로 스크립트에서 'date.sh'를 찾지 못했습니다.

셸 스크립트에서 프로그램으로 데이터를 가져 오려면 파이프를 파이프에 넣거나 "date.sh"가 파일에 데이터를 성공적으로 덤프하도록 정렬해야합니다. 물론 Perl은 내장 된 날짜 및 시간 처리 기능을 가지고 있으므로 셸을 사용할 필요가 없습니다.

도 도움이 될 use warnings; 또는 use strict;으로 실행되지 않았습니다. 예를 들어 $cat1은 정의 된 변수가 아닙니다.

개인적으로 나는 cron에서 간단한 쉘 스크립트를 실행하고 모든 복잡성을 처리하도록합니다. 나는 crontab 파일에서 I/O 리디렉션을 사용하지 않습니다. 이것은 부분적으로 고대 시스템에서 일하는 유산이지만, 휴대 가능하고 신뢰성있는 cron 작업 실행에도 이르게됩니다.

+0

조언 주셔서 감사합니다! 그것은 많은 도움이됩니다 :-) – Cez

0

스크립트에 많은주의가 필요한 사항이 있으며, 대부분의 내용은 "보안 프로그래밍 기법"장 Mastering Perl에서 설명합니다.또한 일부를 찾을 수 있습니다. perlsec/

외부 데이터를 가져 와서 다른 외부 프로그램으로 전달하기 때문에 데이터가 예상 한 것과 같은지 확인하기 위해 오염 확인을 사용해야합니다. 누군가 그 파일에 뭔가를 몰래 넣을 수 있다면 어떨까요?

외부 프로그램에 데이터를 전달하려면 목록 양식에서 system을 사용하십시오. 그러면 쉘이 가능한 메타 문자를 해석 할 기회를 얻지 못합니다.

실행하려는 프로그램을 찾기 위해 PATH에 의존하는 대신, 자신이 생각하는 파일을 적어도 실행하고 있는지 확인하기 위해 전체 경로를 명시 적으로 지정하십시오. in PATH). 만약 당신이 정말로 불쾌감을 느낀다면 (예를 들어 테트 체크가 그렇듯이), 그 파일들과 디렉토리들이 적절한 허가를 받았는지 (예를 들어, 세계 기록 가능이 아닌지) 확인할 수 있습니다. 그냥 보너스 참고로

, 당신은 단지 핸들에서 한 줄을 원한다면, 당신은 스칼라 문맥에서 라인 입력 연산자를 사용할 수 있습니다 :

my $date = <$fh>; 
당신은 아마 없애 너무 데이터를 chomp

가능한 종료 줄 바꿈. 다른 프로그램에서 파일을 작성했기 때문에 종료하는 개행 문자가 있어야한다고 생각하지 않더라도 텍스트 편집기로 파일을보고있는 누군가가 문자를 추가 할 수 있습니다.

행운을 빕니다 :)

관련 문제