是否可以在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;
答案 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数据也可以删除可能的结束换行符。即使你不认为终止换行应该在那里,因为另一个程序创建了文件,有人用文本编辑器查看文件可能会添加它。
祝你好运,:))