mind.

学んだことの記録

cronで実行するプログラムは絶対パスを書くこと

なぜ?

これを知らなかったので仕事で丸一日悩んでました……。

試してみる

下記のようなコードを書いてみました。

import datetime
with open("file.txt", mode='a') as f:
    f.write("{}\n".format(datetime.datetime.now()))

ファイルに現在時刻を追記する、大したこと無いプログラムです。
ポイントは、open()の第一引数の"file.txt"がそのままになっていることです。
これを実行すると、"file.txt"はcronが実行されたときのユーザーのカレントディレクトリに作成されます。
つまり、プログラム作成時に意図していない場所にファイルが作成されることになるので危険です。

絶対パスに修正します。

import datetime
with open("/home/vagrant/test_dir/file.txt", mode='a') as f:
    f.write("{}\n".format(datetime.datetime.now()))

これで安心。

余談

cronで実行させるファイルには忘れずに実行権限を与えよう。