cron

cronの環境変数について

More than 1 year has passed since last update.

はじめに

cronを実行する度に、**** is not foundと言われてがっくり来ちゃうので、cronの初期値って一体どうなってるの?と思い、調べてみた次第です。

結論

crontab -eなどでPATH変数を明示的に宣言してやらないと、/usr/bin/binしか参照できないようでした。/etc/crontabなどでもPATHは宣言可能のようですが、それは他の記事をググれば良いかと。

対象環境

  • OS
    • Ubuntu 16.x Server 64bit

初期環境変数

# Example of job definition:
# .---------------- minute (0 - 59)
# |  .------------- hour (0 - 23)
# |  |  .---------- day of month (1 - 31)
# |  |  |  .------- month (1 - 12) OR jan,feb,mar,apr ...
# |  |  |  |  .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# |  |  |  |  |
# *  *  *  *  * user-name command to be executed
  *  *  *  *  * env > /tmp/env.log

上記で取り出した、cron実行時の環境変数が下記。
/usr/bin/binしか参照しないんですね。

HOME=/home/imasami
LOGNAME=imasami
PATH=/usr/bin:/bin
LANG=en_US.UTF-8
SHELL=/bin/sh
PWD=/home/imasami

crontabに最初から書かれていたのは下記で、何故かPATHが大きく違う。

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

これはさておき、好きなPATHにしてしまいましょうか。

crontab -e 環境変数を書き換え

PATH=/usr/bin:/usr/sbin:/home/imasami/.rbenv/shims/:$PATH

# Example of job definition:
# .---------------- minute (0 - 59)
# |  .------------- hour (0 - 23)
# |  |  .---------- day of month (1 - 31)
# |  |  |  .------- month (1 - 12) OR jan,feb,mar,apr ...
# |  |  |  |  .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# |  |  |  |  |
# *  *  *  *  * user-name command to be executed
  *  *  *  *  * env > /tmp/env.log

crontab -eでPATHを宣言したら下記のように反映されているのを確認できた。

HOME=/home/imasami
LOGNAME=imasami
PATH=/usr/bin:/usr/sbin:/home/imasami/.rbenv/shims/:$PATH
LANG=en_US.UTF-8
SHELL=/bin/sh
PWD=/home/imasami

$PATHは展開されないんですね。