我有一个perl脚本:每分钟都被cron调用的run.pl。
run.pl唯一能做的就是调用另外两个脚本:download.pl和parse.pl:
#!/usr/bin/perl
use warnings;
use strict;
do 'download.pl';
do 'parse.pl';
print "done!\n";
在download.pl和parse.pl中有两个打印到“完成下载”和“完成解析” 现在我将脚本输出到/var/log/script.log并检查要运行的脚本。
run.pl脚本运行正常,输出“done!”到日志文件。但是没有调用其他两个脚本。我认为这是一个相对路径问题,当我使用绝对路径时它会起作用。
但这就是问题,脚本在teststage中并且每次都改变路径,总是改变绝对路径会很麻烦。
有没有办法让脚本从相对路径运行?
编辑: 当我自己从命令行使用“perl run.pl”运行它时,它运行脚本没有问题。
答案 0 :(得分:5)
do
?你知道,那不会“召唤”一个节目!
这些图书馆模块或程序吗?
此外,预计会在$ENV{PATH}
中找到程序,而在@INC
中可以找到库。这些几乎肯定是不同的东西。
我的建议是:
$ENV{PATH}
中的其他程序,请使用system()
或反对。@INC
中加载图书馆,请使用require
或use
。do FILE
保留为异乎寻常的巫术目的,几乎肯定不适用于此。答案 1 :(得分:4)
Cron作业不会使用shell登录所看到的相同环境运行。一个cron作业通常会将cron的用户主目录作为其默认工作目录。
解决这个问题的一个选择是使用FindBin
找到脚本所在的目录,并根据该目录建立路径。
#!/usr/bin/perl
use warnings;
use strict;
use FindBin qw($Bin);
do $Bin.'download.pl';
do $Bin.'parse.pl';
print "done!\n";
将download.pl
和parse.pl
转换为实际模块可能会更好,从长远来看,它可能会为您省去一些努力。
答案 2 :(得分:0)
$rootdir=`dirname "$0"`;
### call your scripts here relative to $rootdir
无济于事?