最近、oracleに対してSQLPlusやSQL*Loaderで定期的にデータを云々する必要があったのですが、crontabでハマって手間取ったので備忘録も兼ねて残しておきます。
前提
OS:CentOS Linux release 7.0.1406 (Core)
結論
- crontabでは
/usr/bin
と/bin
しかパスが通っていない - ちなみに実行時のカレントディレクトリはユーザのホームディレクトリ
確認
printenvでPATHを表示した場合
[kabu0404@DARIUS ~]$ printenv PATH
/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/kabu0404/.local/bin:/home/kabu0404/bin
crontabで同じコマンドを実行した場合
[kabu0404@DARIUS ~]$ crontab -l
*/1 * * * * printenv PATH > ~/path.txt
[kabu0404@DARIUS ~]$ cat path.txt
/usr/bin:/bin
crontab内でパスを通した場合
[kabu0404@DARIUS ~]$ crontab -l
*/1 * * * * printenv PATH > ~/path_before.txt; export PATH=/usr/local/bin:$PATH; printenv PATH > ~/path_after.txt
[kabu0404@DARIUS ~]$ cat path_before.txt
/usr/bin:/bin
[kabu0404@DARIUS ~]$ cat path_after.txt
/usr/local/bin:/usr/bin:/bin
実行時のカレントディレクトリ
ついでに調べてみた
[kabu0404@DARIUS ~]$ crontab -l
*/1 * * * * pwd > ~/pwd.txt
[kabu0404@DARIUS ~]$ cat pwd.txt
/home/kabu0404
チラシの裏
crontabを使用する場合は、実行するスクリプト内でパスを通すか、コマンドをフルパスで書くか、どちらかでしょうか。パスを通した方が、別環境でパスが違う時とかに対応しやすそうですかね。
いずれにせよwhich
を使うなどして「自分が使うコマンドがどこにあるのか」というのは意識しておいた方が良さそうですね。