3

私はすべて正常に動作する Perl スクリプトをたくさん持っていますが、それを実行する必要がありuse Plibdata;ます。

実行する cron ジョブをセットアップし (root から確認メールを受け取ります)、次のエラー メッセージが表示されます。

Can't locate Plibdata.pm in @INC (@INC contains: /install/lib /opt/perl58/lib/5.8.8/IA64.ARCHREV_0-thread-multi /opt/perl58/lib/5.8.8 /opt/perl58/lib/site_perl/5.8.8/IA64.ARCHREV_0-thread-multi /opt/perl58/lib/site_perl/5.8.8 /opt/perl58/lib/site_perl .) at ./x line 5.

BEGIN failed--compilation aborted at ./x line 5.

5 行目は... ご想像のとおり....use Plibdata;

私はまた、環境をそのように設定しようとしています:

use lib "$ENV{CARSPATH}/install/lib";

この plibdata の場所を見つけたら、明示的にそのように指示できますか?

私のcronコマンドは、/usr/bin/shsay crontabsを使用して実行されます...

助言がありますか?

このスクリプトは、コマンド ラインから機能します。

4

6 に答える 6

7

あなたはPlibdataが何であるかを言いません。これがコマンドプロンプトで機能するかどうかも述べていません。そうだと思います。

これを試して:

perl -MPlibdata -e 1

それが同じエラーを吐き出さないと仮定して、これを試してください:

perl -MPlibdata -le 'print $INC{"Plibdata.pm"}'

それはどこを教えてくれます。(これが機能する場合は、おそらく PERL5LIB 環境変数にあります。) 次に、適切な "use lib" を Plibdata.pm があるディレクトリに追加するだけです。

また、コマンド ライン ("which perl") と cron ジョブ (スクリプトの先頭で "BEGIN { print $^X }" を試してください) の両方で同じ perl を使用していることを確認してください。

于 2009-04-15T20:58:00.800 に答える
6

Cron は、ログイン時にあなたの環境とは異なるユーザー環境を使用します。コマンド ラインからスクリプトを実行できますか? その場合は、現在のコマンドの上の cron 内に環境変数を設定するだけです。

于 2009-04-15T20:59:46.880 に答える
5

明らかに、Plibdata.pmシステムのデフォルトのモジュール パスにインストールされていません。

/install/lib /opt/perl58/lib/5.8.8/IA64.ARCHREV_0-thread-multi /opt/perl58/lib/5.8.8 /opt/perl58/lib/site_perl/5.8.8/IA64.ARCHREV_0-thread-multi /opt/perl58/lib/site_perl/5.8.8 /opt/perl58/lib/site_perl

次の 3 つの選択肢があります。

  1. Plibdata.pm既知の Perl システム パスにインストールします (site_perlは従来のオプションです)。

  2. PERL5LIB シェル環境 (または-IPerl の同等のコマンド ライン オプション) に、モジュールのインストール パスを含めます。

  3. use libスクリプトで使用します。アクションuse libはコンパイル時に行われるため、パス内の変数が初期化されない可能性があることに注意してください。BEGIN次のようにブロック内で変数を使用してみてください。

    my $env;
    
    BEGIN {
      $env = $ENV{CARSPATH};
    }
    
    use lib "$env/install/lib";
    
于 2009-04-15T21:57:24.433 に答える
2

他の人が示唆しているようにラッパースクリプトからプログラムを実行するのがおそらく私の好ましい方法ですが、他にもいくつかの解決策があるかもしれません。

最新のcronを使用している場合は、crontabエントリで次のようなことができる場合があります。

* * * * * CARSPATH=/opt/carsi x

アスタリスクを適切なスケジュール指定子に置き換えます。

これにより、xプロセスのCARSPATHが設定され、環境変数を渡すuselibステートメントが機能できるようになります。

また、シェルとcronの実装に応じて、環境設定をファイルに保存し、次のような操作を行うこともできます。

* * * * * source specialenv.sh && x

specialenv.shに(bashの場合)のような行が含まれている場合

export CARSPATH=/opt/carsi

必要に応じて、crontabで環境変数を直接設定できる場合もあります。

于 2009-04-16T16:49:47.500 に答える
2

cronコードを実行するときに環境をセットアップしないため、環境変数$CARSPATHは存在しません。cron からのみシェル スクリプトを実行し、シェル スクリプト内で環境を設定してから、本当に実行したいプログラムを実行することをお勧めします。

ラッパー スクリプトの例:

#!/bin/bash

source ~username/.bash_profile
cd ~username
./script.pl

あなたが使用している場合、kshまたはsh言う必要があるかもしれません

#!/bin/sh

. ~username/.profile
cd ~username
./script.pl

ユーザー名をシステム上のユーザー名に置き換えることを忘れないでください。また、スクリプトがホーム ディレクトリにない場合は、./.

source現在のシェルに特定のシェルスクリプトをロードするには、またはピリオドスペースと言います。環境設定が現在のシェルにとどまるように、現在のシェルにロードします。

~/.bash_profile、、、、などはすべて、一般的に環境設定を保持するファイルです~/.bashrc。どちらを使用しているかは、OS とその設定者によって大きく異なります。~/.profile/etc/profile

于 2009-04-15T21:52:06.690 に答える
0

「答え」ではありませんが、Plibdata の代わりに DBI を使用してこの問題を解決しました。

いくつかのスクリプトを変更する必要があるため、これは乳白色です...ああ、Plibdataを機能させるために何かできることがあればいいのにと思います

私はまだチャスを試すつもりです。オーエンスはそれが機能するかどうかを確認するために答えます


私にはうまくいきませんでした...「インタープリター "/bin/bash" が見つかりません」
そのインタープリターを持っている人にはうまくいくかもしれません



* * * * * CARSPATH=/opt/carsi ./x

作品

于 2009-04-16T15:59:02.100 に答える