ひろこま Hack Log

プログラミングや機械学習などの知識を記録・共有します

CRONでハマりやすい重要なポイント3つ

f:id:twx:20191116163338p:plain

cronとは

cronとは、設定したスケジュールに従って指定されたプログラムやシェルコマンドを定期的に起動してくれる仕組み。 実行スケジュールは分刻みで指定することができる。また、毎時、毎日、毎週、毎月などを指定することもできる。

crontabというコマンドでこれらのスケジュールを記載することができる。

あるある1. 環境変数が引き継がれない

crontab内のプログラムで環境変数を参照したい場合、ちょっとした工夫が必要。

たとえば、以下のように HOGE という環境変数を参照するpythonプログラム test.py があるとする。

import os
print(os.getenv('HOGE'))

これをcrontabで実行しても、何も表示されない。

# だめな例
* * * * * ubuntu python /home/ubuntu/test.py > log

crontab内で環境変数を使用したい場合、以下の2つの方法がある。

  • crontab内で変数を設定する
  • ~/.profile または ~/.bash_profile に環境変数を設定しcrontab内でこれを読み込む

1つめの例

crontab内で変数を設定する。

HOGE=piyo
* * * * * ubuntu python /home/ubuntu/test.py > log

2つめの例

~/.profile または ~/.bash_profile に環境変数を設定しcrontab内でこれを読み込む。crontab内で ~/.profile を読み込むためには bash -l を使用する。

* * * * * ubuntu bash -l python /home/ubuntu/test.py > log

あるある2. crontab -e/etc/crontab のどちらを使うべきか

crontabは以下の2通りの方法で設定できる。

  • crontab -e コマンドを使う
  • viなどで/etc/crontabを編集する

どちらも基本的には同じようにcronを設定できるのだが、一般的には後者の/etc/crontabを編集する方法が推薦されている。

というのも、前者のcrontab -ecrontab -rと打ち間違える可能性があるためである。 crontab -r はcrontabを削除するコマンド。 EキーとRキーは隣り合っているのでうち間違えてcrontabを削除してしまうという事態を招きかねない。

あるある3. パーセント記号が使えない?

スクリプトのログを出力する際、以下のようにログのファイル名に現在時刻を付与する人は多いと思う。

$ echo "aaaaaaa" > hoge_$(date +%Y%m%d%H%M).log
$ ls
hoge_201911161659.log

これをcrontabでやろうとしても、実はうまくいかない。

# だめな例
* * * * * ubuntu bash -l python /home/ubuntu/test.py > hoge_$(date +%Y%m%d%H%M).log

実はパーセント記号は以下のようにエスケープする必要がある。

* * * * * ubuntu bash -l python /home/ubuntu/test.py > hoge_$(date +\%Y\%m\%d\%H\%M).log

以上、cronで気をつけるべきポイントでした。

良い記事だと思っていただいた方は、以下の「★+」ボタンのクリック、SNSでのシェア、「読者になる」ボタンのクリック、Twitterのフォローをお願いします!

Koma Hirokazu 's Hacklog ―― Copyright © 2018 Koma Hirokazu