cron実行時の環境変数を設定

cronからコマンドを実行するときの環境変数を設定するためのメモ。

動機

cronからコマンド実行すると、環境変数がほとんど設定されていなくて色々と支障が出ることが多い。これまでコマンド実行前に.profileを読み込むよう記述していたけど、もうちょっとスマートな方法がないか調べてみた。

環境変数を渡す方法

実行時に設定ファイルを読み込む

コマンド実行前に、次のようにして.profileや.loginなどを読み込む。

* * * * * . ~/.profile;/usr/local/bin/cronjob

自分はずっとこの方法でやっていた。ログイン時と同じ環境で実行できるので便利。でも、毎回定義の行にこの記述を入れる必要があり、見た目がすっきりしない。

シェル引数に-l指定

コマンド実行時にシェルを指定し、そのシェルの引数に-lを渡してやることでログインシェルと同じ環境変数を実現する。

* * * * * /usr/local/bin/bash -l /usr/local/bin/cronjob

この方法が使えるのは、引数-lでログインシェルとして実行する機能のあるbashはzshなどのみ。FreeBSDにシステムデフォルトで入っている/bin/shや/bin/tcshでは使えない方法。また、すべての実行行に起動シェルの記述が必要となり、微妙な感じ。

シバン行でシェル引数に-l指定

実行するシェルスクリプトの先頭行で、ログインシェルとして動かすよう-lを指定する。

#!/usr/local/bin/bash -l

cronの定義行に無駄な記述がなくなるのがメリット。実行するのがシェルスクリプトでない場合には使えない方法。

crontab内でPATH定義

crontabファイルの中で、必要なPATHを定義しておく。

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

* * * * * cronjob

cronの定義ごとに環境変数を読み込ませるための記述を追加する必要がなく、すっきり。使って良いパスをここで制限できるので、セキュリティの面からもパスを追加するならこの方法が良いと思う。

結論

必要なパスだけをcrontab内に追加して利用することにした。