0

毎分 cron によって呼び出される perl スクリプト run.pl があります。

run.pl が行う唯一のことは、他の 2 つのスクリプト (download.pl と parse.pl) を呼び出すことです。

#!/usr/bin/perl
use warnings;
use strict;

do 'download.pl';
do 'parse.pl';
print "done!\n";

download.pl と parse.pl には、「ダウンロード完了」と「解析完了」の 2 つの出力があります。スクリプトを /var/log/script.log に出力し、スクリプトが実行されるかどうかを確認します。

run.pl スクリプトは問題なく動作しており、「done!」と出力されます。ログファイルに。ただし、他の 2 つのスクリプトは呼び出されません。相対パスの問題だと思います。絶対パスを使用すると機能します。

しかし、それが問題です。スクリプトはテストステージにあり、パスを毎回変更します。絶対パスを常に変更するのは面倒です。

スクリプトを相対パスから実行させる方法はありますか?

編集:「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 ジョブは、シェル ログインで表示されるのと同じ環境では実行されません。通常、cron ジョブには、デフォルトの作業ディレクトリとして、cron のユーザーのホーム ディレクトリがあります。これを回避する 1 つのオプションは、 を使用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。長期的には労力を節約できるかもしれません。

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

### call your scripts here relative to $rootdir

役に立たない?

于 2010-11-08T17:06:28.743 に答える