0

我有一个 perl 脚本:run.pl,cron 每分钟都会调用它。

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 脚本运行良好,它输出“完成!” 到日志文件。但是其他两个脚本没有被调用。我认为这是一个相对路径问题,当我使用绝对路径时它可以工作。

但这就是问题所在,脚本处于 teststage 并且每次都会更改路径,总是更改绝对路径会很麻烦。

有没有办法让脚本从相对路径运行?

编辑:当我使用“perl run.pl”从命令行自己运行它时,它会毫无问题地运行脚本。

4

3 回答 3

5

嗯,你为什么用do?这不会“调用”程序,你知道的!

这些是库模块还是程序?

此外,程序预计会在 中找到$ENV{PATH},而库预计会在@INC. 这些几乎可以肯定是不同的东西。

我的建议是:

  1. 要在 中调用另一个程序$ENV{PATH},请使用system()或反引号。
  2. 要在 中加载库@INC,请使用requireuse
  3. 保留do FILE几乎肯定不适用于这里的奇异魔法目的。
于 2010-11-08T17:04:36.210 回答
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.plparse.pl转换为真正的模块,从长远来看,它可能会为您节省一些精力。

于 2010-11-08T17:03:54.580 回答
0
$rootdir=`dirname "$0"`;

### call your scripts here relative to $rootdir

没有帮助吗?

于 2010-11-08T17:06:28.743 回答