私は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