crontab と /usr/local/bin 内のバイナリ

crontab と /usr/local/bin 内のバイナリ

私は作業中で、ユーザーが呼び出したいRedhatプログラムがフォルダー内にいくつかあります。そのフォルダーにバイナリを配置すれば、シェルのようにプログラムを直接呼び出すのに十分だと思いました。/usr/local/bincrontabroot

基本的に毎回フォルダを指定する必要があるので、以下のcrontabは機能しません

 5 9  * * 1,2,3,4,5 my_bin some_args

しかし私はそれを変更します

 5 9  * * 1,2,3,4,5 source ~/.bashrc; /usr/local/bin/my_bin some_args

なぜなのかご存知ですか?

私がソースを取得した理由はbashrc、特にLD_LIBRARY_PATHバイナリが からいくつかの共有ライブラリを見つけられなかったため、いくつかの環境ライブラリを追加するためでした/usr/local/lib

答え1

cron ジョブは非常に最小限の環境で実行され、crondシェルなしで直接実行されるため (シェルを強制的に作成しない限り)、通常のシェル設定は行われません。この問題を回避する標準的な方法が 2 つあります。まず、crontab で環境変数を定義します (これらはすべてのジョブに適用されますが、少なくとも定義の後にリストされているジョブには適用されます)。

PATH=/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin
LD_LIBRARY_PATH=/usr/local/lib

5 9  * * 1,2,3,4,5 my_bin some_args

次に、スクリプトを環境への依存度が低くなるように編集し (たとえば、スクリプト自体に何が必要になるかを定義する)、crontab エントリでフルパスを使用します。

5 9  * * 1,2,3,4,5 /usr/local/bin/my_bin some_args

関連情報