如何从cron运行的Perl脚本中运行shell脚本?

时间:2010-01-05 02:59:10

标签: perl shell scripting cron

是否可以在cron中运行带有shell sript(date.sh& backlog.sh)的Perl脚本(vas.pl),反之亦然? 感谢。

 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;

4 个答案:

答案 0 :(得分: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");

或者,如果您对我这样的硬编码路径过敏,您可以使用CPAN的FindBin包:

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

如果您的shell脚本还需要以正确的路径启动,那么首先更改您的工作目录可能更好:

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

答案 1 :(得分:3)

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

使用cron作业要记住的第一件事是你几乎没有设置环境。

可能性是,当前目录为/$HOME。并且$ PATH的值很小 - 例如,您的个人资料尚未运行。

因此,您的脚本找不到'date.sh',因为它不在正确的目录中。

要将shell脚本中的数据存入您的程序,您需要将其传送到那里 - 或者安排'date.sh'将数据成功转储到文件中。当然,Perl具有内置的日期和时间处理功能,因此您无需使用shell。

您也没有使用use warnings;use strict;,这对您也有帮助。例如,$cat1不是已定义的变量。

就个人而言,我从cron运行一个简单的shell脚本,让它处理所有复杂问题;我不在crontab文件中使用I / O重定向。这部分是在古代系统上工作的遗产 - 但它也导致cron工作的便携和可靠运行。

答案 2 :(得分:2)

这是可能的。请记住,在cron下运行时,您的工作目录可能不是您认为的那样 - 它是您的HOME环境变量中的值,或者/ etc / passwd文件中指定的值。考虑完全限定你的.shes的路径。

答案 3 :(得分:0)

您的脚本中有很多需要注意的事项,我在Mastering Perl的“安全编程技术”一章中讨论了大部分内容。你也可以在perlsec /

中找到一些

由于您正在获取外部数据并将其传递给其他外部程序,因此您应该使用污点检查来确保数据符合您的预期。如果有人能够将额外的东西偷偷带进这些文件怎么办?

如果要将数据传递给外部程序,请在列表表单中使用system,这样shell就无法解释可能的元字符。

不要依赖PATH来查找您希望运行的程序,而是明确指定其完整路径,以确保您至少运行您认为自己的文件(而不是某人偷偷溜进目录那是PATH中的早期版本。如果你真的是偏执狂(就像污点检查那样),你也可能会检查那些文件和目录是否具有合适的权限(例如,不是世界可写的)。

作为奖励说明,如果您只需要文件句柄中的一行,则可以在标量上下文中使用行输入运算符:

 my $date = <$fh>;

您可能希望chomp数据也可以删除可能的结束换行符。即使你不认为终止换行应该在那里,因为另一个程序创建了文件,有人用文本编辑器查看文件可能会添加它。

祝你好运,:))