cronの基本的な使い方は、前回の記事で紹介しています。
今回は、実際にcronでありがちなトラップを紹介します。
Command not found というエラー
例えば、cronでpythonのプログラムを実行しようと思います。
「crontab -e」 で編集します。
*/30 * * * * python sample.py
例では、sample.pyを30分ごとに実行するようにcronに設定しています。
うまく実行されているか確認します。/var/spool/mail/ユーザ名に実行結果が記録されていきます。
また記録されていなかったらリダイレクトしてもよいです。
リダイレクトについては、下記の記事で取り上げてます。
さて、これで、完了かと思いきや、「python: Command not found」と吐かれています。
原因
あれ、コマンドラインでpythonは実行できるのになぜcronではできないのか。
それは、cronでは、cron用のPATHがあるからです。/etc/crontabの中身を見てください。
# /etc/crontab: system-wide crontab
# Unlike any other crontab you don't have to run the `crontab'
# command to install the new version when you edit this file
# and files in /etc/cron.d. These files also have username fields,
# that none of the other crontabs do.
SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
最後の行が、cron用のPATHです。因みに今のユーザのPATHは、
$ echo $PATH
で確認できます。
明らかにcron用のPATHより多いと思います。
というようにPATHが通っていないので実行出来ないのです。
したがって、PATHを追加しましょう。返されるPATHは、環境によって異なります。
解決方法その1
コマンドラインと同じように実行できるようにするため、今のユーザのPATHを「echo $PATH」で標準出力し、コピーしましょう。
次に、crontab -e で編集ファイルを開きます。
一番上にコピーしたPATHをペーストしてください。
PATH=/usr/bin:/usr/local/bin:..............
*/30 * * * * python sample.py
これで、うまくいくはずです。
解決方法その2
また、コマンドを絶対パスで直接記述することでも実行できます。今回は、例として、pythonのコマンドのPATHを調べます。
$ which python
上記のコマンドを実行すると、PATHが表示されると思います。返されるPATHは、環境によって異なります。
そのPATHをcrontab -e で編集ファイルに記述します。今回は、/usr/local/binと返されたと仮定すると下記のように記述します。
*/30 * * * * /usr/local/bin/python sample.py
まとめ
cronでCommand not found が表示されたら、PATHが通っていない。
PATHを「crontab -e」 で編集ファイルに記述しましょう。
この記事を読んだ方は、こちらの記事をおススメします。
おススメ書籍
Linuxを学ぶ上で、おススメの書籍を紹介します。
この書籍は、LPICというLinuxのプロフェッショナルとして認定される資格の教科書になります。
資格の教科書ですが、Linuxを学ぶ上でもってこいの書籍です。自分は、この書籍でLPICを取得しました。
Linux教科書 LPICレベル1 Version5.0対応
初めてLinuxを触る人でも分かりやすく表現されており、読みやすいです。
新しいLinuxの教科書