5

私はperlスクリプトを持っています(具体的には、「グラバー」のXMLTVtv_grab_oztivoファミリーの一部です)。

私はそれを次のように正常に実行できます:

/sw/bin/perl /path/to/tv_grab_oztivo --output /path/to/tv.xml

作業ディレクトリの問題を排除するために、すべてへのフルパスを使用します。権限は問題にはなりません。

したがって、ターミナル(Mac OSX)から実行すると、問題なく動作します。

しかし、cronジョブを介して実行するように設定すると、何も起こらないように見えます。出力などは作成されません。

実際のスクリプトの代わりにhelloworld.plを使用すると、適切なタイミングで正常に実行されるため、私が見る限りcrontabに問題はありません。

だから、私はデバッグするために何ができますか?2つのケースを見る%ENVと、環境が大きく異なることがわかりますが、デバッグには他にどのようなアプローチがありますか?cronジョブの出力を確認するにはどうすればよいですか。これは、シェルなどからの何らかのperl「die」メッセージまたは「notfound」メッセージである可能性があります。

または、コマンドのcronバージョンを、自分と同じ環境で実行する場合と同じ環境にする必要がありますか?

4

5 に答える 5

8

多くの場合、cronで実行すると完全な環境が得られないことが原因です。最善の策は、次のコマンドを使用して出力をキャプチャすることです。

( /sw/bin/perl /path/to/tv_grab_oztivo ... ) >/tmp/qq 2>&1

次に、を見てください/tmp/qq

それが欠落している環境であることが判明した場合は、次のように入力する必要があります。

. ~/.profile

または、次のようなcronジョブの実行チェーンに類似したものを追加します。

( . ~/.profile ; /sw/bin/perl /path/to/tv_grab_oztivo ... ) >/tmp/qq 2>&1
于 2009-04-23T02:24:38.863 に答える
3

2つのケースで%ENVを確認している場合は、perlスクリプトの最初のステップとして、%ENVをcronジョブの値に設定し、コマンドラインから実行することをお勧めします。 。これを完全に制御するには、一度実行する必要がある場合があります。

BEGIN {
  if (exists $ENV{something_in_your_env_not_in_cron}) {
     %ENV = (...);
     exec $^X, $0, @ARGV;
  }
}

それを実行してみて、デバッグするためにできることがあるかどうかを確認してください(必要に応じてperl -dで実行することを含む)。ほとんどの場合、魔法のように機能し始めるまで、一度に1つずつアイテムを%ENVに追加し直すことになります(LD_LIBRARY_PATHはこれに適していますが、OracleまたはDB2アプリのORACLE_HOMEまたはDB2HOMEも適切な選択です。 )。次に、スクリプトまたはcrontabで変数を設定できます。

于 2009-04-23T02:26:14.147 に答える
0

cronコマンドから絶対パスで簡単なシェルスクリプトを実行します。そのスクリプト内で、stdoutとstderrを既知の(または既知の)ファイルにトラップしたことを確認します。また、十分な環境が設定されていることを確認します。Unixでは、cronを介してコマンドを実行すると、環境がほとんど設定されません。MacOSXについてはよくわかりません。問題の標準的な原因はPATHです。.cronfile私は通常問題がないように私の作業環境を十分に設定する別のものを持っています-それはの類似物です.profile

于 2009-04-23T02:26:21.823 に答える
0

コマンドラインで何が問題になっているのかわからない場合は、それを修正する最も簡単な方法は、すべてをシェルスクリプトに変換することです。理想的にはこれを行う必要はありません、問題を解決するための最速の方法です。

ファイル:/files/cron1.sh

#!/bin/sh
/sw/bin/perl /path/to/tv_grab_oztivo --output /path/to/tv.xml

そしてcronで:

/files/cron1.sh

これにより、cronに関係なくスクリプトをテストできます。ただし、ログインシェルはcronとは異なる環境変数で実行されることに注意してください。

于 2009-04-23T02:30:02.047 に答える
-1

cronは通常、stdoutとstderrの出力をキャプチャし、出力をcrontabの所有者に電子メールで送信します。

crontabエントリを再確認して、有効であり、適切なタイミングで実行されることを確認しましたか?

スクリプトに環境変数を設定する必要がないことを確認してください。それ以外の場合は、別の(bash)スクリプトでラップします。ここで、他のスクリプトが期待する環境変数を設定できます。

于 2009-04-23T02:24:22.857 に答える