目次
cronとは?
UNIX系のOSにおいて定期的にジョブを実行するデーモンプロセスです。
バッチ処理などを定期的に実行する際に使用したりします。
条件
- Ubuntu 16.04 LTSを使用。
cronの使い方
大きく2通りの使い方があります
- crontabコマンドを使用する。(非推奨)
- cron.dディレクトリに設定ファイルを作成する。
crontabコマンドを使用する場合(非推奨)
編集
以下のコマンドを実行します。
crontab -e
当該コマンドを実行しているユーザのcrontab設定/編集を行います。
/var/spool/cron/crontabs の下にユーザ名のファイルが作成されます。
例えばuserAで「crontab -e」による設定を記述した場合、/var/spool/cron/crontabs/userAというファイルが作成されます。
記述例は以下の通りです。
# m h dom mon dow command # 毎日12:45にtest.shというShellを実行する 45 12 * * * /bin/bash /home/userA/test/test.sh
確認
以下のコマンドを実行します。
crontab -l
当該コマンドを実行しているユーザのcrontabの内容を参照します。
未設定の場合「no crontab for userA」のようなメッセージが表示されます。
削除
以下のコマンドを実行します。
crontab -r
当該コマンドを実行しているユーザのcrontab設定を削除します。
/var/spool/cron/crontabs の下にある当該ユーザ名のファイルが削除されます。
「-e」のつもりが「-r」を入力してしまってcrontab設定をすべて削除してしまったというケースが後を絶たず…。
当サイトではcrontabコマンドを使用するのは非推奨としています。
cron.dディレクトリに設定ファイルを作成する場合
/etc/cron.dディレクトリの下に拡張子のない設定ファイルを配置することで、crontabコマンドで設定した場合と同様のことを行うことが出来ます。
フォーマットのコピー
まずはフォーマットファイルをコピーします。
ここではcron_testというファイル名でコピーしています。
$ sudo cp /etc/crontab /etc/cron.d/cron_test
設定編集
コピーしたフォーマットを編集します。
crontabコマンドを使用した場合と書式が異なる点にご注意ください。
$ sudo vi /etc/cron.d/cron_test
記述例は以下の通りです。
# m h dom mon dow user command # 10分ごとに実行する */10 * * * * userA /bin/bash /home/userA/test/test.sh # 毎日23:58に実行する 58 23 * * * userA /bin/bash /home/userA/test/test.sh
設定反映
cronの再起動を行います。
$ sudo service cron restart
設定を削除する場合
設定をコメントアウトまたは削除、または当該ファイルを削除すればcron設定は無くなります。
参考
cronを用いたShellによるPythonファイル定期実行の例です。
cron設定
/etc/cron.dディレクトリの下に拡張子のない設定ファイルを配置して以下のように記述。
# m h dom mon dow user command # 10分ごとに実行する */10 * * * * userA /bin/bash /home/userA/test/test.sh >> /home/userA/test/log/cron.log
「>>」でファイルを指定することで、標準出力やエラー出力をログファイルに書き込むことができます。
shell
以下のようにshellで指定のPythonファイルを実行するようにします。
(test.pyは、/home/user/testディレクトリの下に存在する)
#!/bin/bash cd /home/user/test /usr/bin/python3 test.py
「cd /home/user/test」としているところがポイントです。
対象ファイルtest.pyのあるディレクトリに予め移動することで、Python内のパスの記述と齟齬がでないようにしています。
shellが実行できるよう権限を設定します。
$ chmod 755 ftp.sh
Pythonファイル
以下のようなPythonファイルを/home/user/testディレクトリに配置します。
/home/user/test/log/test.logにログを出力するようにしています。
from logging import getLogger, StreamHandler, Formatter, DEBUG, FileHandler ## ログ出力設定 logger = getLogger("Cron Test") logger.setLevel(DEBUG) # コンソール出力設定 stream_handler = StreamHandler() formatter = Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s') stream_handler.setFormatter(formatter) logger.addHandler(stream_handler) # ログのファイル出力設定 file_handler = FileHandler('log/test.log') file_handler.setFormatter(formatter) logger.addHandler(file_handler) logger.info('cron Test')