2010-01-05 254 views
2

是否有可能在cron中使用shell sript(date.sh & backlog.sh)運行Perl腳本(vas.pl),反之亦然? 謝謝。如何從cron運行的Perl腳本中運行shell腳本?

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 

Perl腳本:

#!/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下運行時,您的工作目錄可能不是您認爲的那樣 - 它是您的環境變量HOME或/ etc/passwd文件中指定的值。考慮完全限定你的.shes的路徑。

+0

或用戶與PATH – Schwern 2010-01-05 03:09:35

+0

感謝:-)我忘了,包括路徑。它的工作原理!:-) – Cez 2010-01-05 03:44:06

8

cron在與當前工作目錄不同的工作目錄中運行perl腳本。使用完整路徑腳本文件:

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

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

或者,如果your're過敏的硬編碼路徑像我,你可以使用CPAN FindBin包:

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

如果你的shell腳本也需要以正確的路徑開始,那麼它可能更好地首先改變你的工作目錄:

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

它已經可以工作了。謝謝:-) – Cez 2010-01-05 03:42:29

+0

@slebetman:正在運行的shell腳本的「home/start」目錄是什麼?我想我有點偏執,但我會確保在那裏有'cd/reports/daily/scripts'或腳本寫入絕對路徑。 (從我的+1解決方案和替代品) – lexu 2010-01-05 06:51:18

+0

@lexu:你說得對。在啓動shell腳本之前應該改變當前的工作目錄以保證安全。但是由於OP提到簡單地加入完整路徑解決了他的問題,那麼在他的情況下他不需要它。 – slebetman 2010-01-05 07:50:20

3

只要你小心,你可以做你想做的。

cron工作要記住的第一件事是你幾乎沒有環境設置。

可能是,當前目錄是/或者$HOME。並且$ PATH的值很小 - 例如,您的配置文件尚未運行。

所以,你的腳本沒有找到'date.sh',因爲它沒有在正確的目錄中。

爲了從shell腳本中獲取數據到你的程序中,你需要在那裏管它 - 或者安排'date.sh'將數據成功轉儲到文件中。當然,Perl有內置的日期和時間處理,所以你不需要爲它使用shell。

你也沒有運行use warnings;use strict;這也可以幫助你。例如,$cat1不是定義的變量。

就我個人而言,我從cron運行一個簡單的shell腳本,讓它處理所有的複雜性;我不使用crontab文件中的I/O重定向。這部分是在古代系統上工作的遺留問題 - 但它也導致便攜式和可靠的cron工作。

+0

感謝您的建議!它有很多幫助:-) – Cez 2010-01-05 03:45:41

0

腳本中有很多事情需要注意,我在Mastering Perl的「安全編程技術」一章中討論了其中的大部分內容。你也可以在perlsec/

中找到它的一部分,因爲你正在接受外部數據並將它們傳遞給其他外部程序,所以應該使用污點檢查來確保數據是你所期望的。如果有人能夠將這些文件額外偷偷地添加到這些文件中,該怎麼辦?

當您想要將數據傳遞給外部程序時,請使用列表形式中的system,以便shell無法解釋可能的元字符。

而不是依靠PATH來查找您希望運行的程序,請明確指定它們的完整路徑,以確保至少運行您認爲自己的文件(而不是某人偷偷進入較早的目錄在PATH)。如果你確實是偏執的(就像檢查異常),你也可以檢查這些文件和目錄是否具有合適的權限(例如,不是世界可寫的)。

正如獎金的注意,如果你只是想從一個文件句柄一條線,你可以使用線路輸入者在標量上下文:

my $date = <$fh>; 

你可能想chomp數據也擺脫可能結束換行。即使你不認爲終止換行符應該在那裏,因爲另一個程序創建了該文件,有人用文本編輯器查看該文件可能會添加它。

祝你好運:)