はじめに
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は展開されないんですね。