ほとんどの場合、cron は非常にまばらな環境で実行されています。 env
をダンプするダミー ジョブを追加して、cron が使用している環境変数を確認します。 次のようなファイルに:
* * * * * env > env_dump.txt
それを env
の出力と比較してください 通常のシェル セッションで。
独自の環境変数を crontab の先頭で定義することにより、ローカル crontab の先頭に追加できます。
$PATH
を先頭に追加する簡単な修正方法を次に示します。 現在のcrontabへ:
# echo PATH=$PATH > tmp.cron
# echo >> tmp.cron
# crontab -l >> tmp.cron
# crontab tmp.cron
結果のcrontabは、crontabルールの前にPATHが定義された、chrissygormleyの回答に似ています。
crontab
にフルパスを入れる必要があります .それが最も安全な選択肢です。
それをしたくない場合は、プログラムの周りにラッパー スクリプトを配置し、そこに PATH を設定できます。
例
01 01 * * * command
になります:
01 01 * * * /full/path/to/command
また、cron
から呼び出されたものすべて 実行するプログラムには細心の注意を払う必要があり、おそらく PATH
に対して独自の選択を設定する必要があります
編集:
必要なコマンドがどこにあるかわからない場合は、which <command>
を実行します。 あなたのシェルから、それはあなたにパスを教えてくれます。
EDIT2:
したがって、プログラムが実行されたら、最初に行うべきことは PATH
を設定することです およびその他の必要な変数 (例:LD_LIBRARY_PATH
) をスクリプトの実行に必要な値に変更します。
基本的に、cron 環境を変更してプログラム/スクリプトにより適したものにする方法を考えるのではなく、開始時に適切な環境を設定することにより、スクリプトが指定された環境を処理するようにします。
/etc/crontab
を使用しました . vi
を使用しました このファイルに必要な PATH を入力し、ルートとして実行しました。通常の crontab は、設定した PATH を上書きします。これを行う方法に関する優れたチュートリアルです。
システム全体の cron ファイルは次のようになります:
This has the username field, as used by /etc/crontab.
# /etc/crontab: system-wide crontab
# Unlike any other crontab you don't have to run the `crontab'
# command to install the new version when you edit this file.
# This file also has a username field, that none of the other crontabs do.
SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
# m h dom mon dow user command
42 6 * * * root run-parts --report /etc/cron.daily
47 6 * * 7 root run-parts --report /etc/cron.weekly
52 6 1 * * root run-parts --report /etc/cron.monthly
01 01 * * 1-5 root python /path/to/file.py