web-dev-qa-db-ja.com

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

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

基本的に、以下の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からいくつかの共有ライブラリを見つけられなかったためです。

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
14
Gordon Davisson