Bash
Ubuntu
cron
RaspberryPi

Cronの使い方とテクニックと詰まったところ

Cronとは

毎日、この時間にプログラムを実行したい!
一時間に一回、検査を走らせたい!
毎月一度、バックアップしたい!

という感情になったことは、誰しもあるでしょう。

そんなとき、Cronの出番です

Cronは起動している限り定期的にプログラムを実行してくれるアプリケーションです。
(WindowsではタスクスケジューラというアプリケーションがGUIで提供されています)

はじめに

今回は、Ubuntu 16.04でやってみたいと思います。

使い方

1. Cronの設定ファイルを確認する

tree
/etc/
├── cron.d
│   ├── anacron
├── cron.daily
├── cron.hourly
├── cron.monthly
├── crontab
├── cron.weekly

cron.d

このフォルダに入った拡張子のないファイルが実行されます。
普段はこちらのフォルダ内にファイルを作成して操作を行います

cron.***

こちらは、日ごと、時間ごと、月ごと、など、
実行しやすいように既に作成されています。この中に実行ファイルを入れれば実行できますが、
ファイルが膨大にならない限りcron.dに個人で作成したほうが楽かもしれません

crontab

このファイルはcronの一番メインのファイルです。
こちらに記載しても動きますが、このファイルの形式を元に動かすことになるので、
編集する際はしっかりバックアップをとっておくことをおすすめします。

2. cron.dにファイルを作成する

ここでは、拡張子のない任意の名前のファイル = test_cron とします

bash
$ cp /etc/crontab /etc/cron.d/test_cron

3. cronの説明

/etc/cron.d/test_cronを編集します

/etc/cron.d/test_cron
SHELL=/bin/bash
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin

# m h dom mon dow user  command
17 *    * * *   root    cd / && run-parts --report /etc/cron.hourly
25 6    * * *   root    test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily )
47 6    * * 7   root    test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.weekly )
52 6    1 * *   root    test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.monthly )
#

コメントアウトされている通りに記載します。

test_cron
# m h dom mon dow user  command
分 時 日 月 曜日 ユーザー コマンド

# 1分ごと
* *    * * *  root   touch /home/ubuntu/test.txt

# 1:00〜1:59まで1分ずつ実行
* 1    * * *  root   touch /home/ubuntu/test.txt

# 毎日1:00に実行
0 1    * * *  root   touch /home/ubuntu/test.txt

# 毎月12日~20日00:00に実行
0 0    12-20 * *  root   touch /home/ubuntu/test.txt

# 毎週月曜日〜金曜日00:00に実行
0 0    * * 1-5  root   touch /home/ubuntu/test.txt

4. Cronの実行

$ sudo service cron restart

テクニック

Cronのログを出す

$ vim /etc/rsyslog.d/50-default.conf

# コメントアウトを外す
# cron.*                          /var/log/cron.log

$ sudo service rsyslog restart

Cronで実行しているコマンドのログを出す

test_cron
* *    * * *  root   touch /home/ubuntu/test.txt >> /[通常ログファイルの場所] 2>> [エラーログファイルの場所]

数秒毎に実行する

test_cron
# for i in `seq [何秒から] [何秒ごと] [何秒まで]`;do (sleep ${i}; [実行するコマンド] ) & done;
# 10秒ごと
* *    * * *  root   for i in `seq 0 10 59`;do (sleep ${i}; touch /home/ubuntu/test.txt ) & done;

外部ファイルから環境変数を読み込み、何秒ごとに実行するかを指定する

/home/ubuntu/.env
TIME=15
test_cron
# bashになっていることを確認する
SHELL=/bin/bash
* *    * * *  root   for i in `source /home/ubuntu/.env && seq 0 ${TIME} 59`;do (sleep ${i}; touch /home/ubuntu/test.txt ) & done;

詰まったところ

1. Tabキー等空白文字の文法ミス

Tab,Spaceキーの場所

*[Space]*[Tab]*[Space]*[Space]*[Tab]root[Tab]Commands   

2. 起動コマンドで起動していない

$ sudo service cron status

Active: active (running)

になってることを確認する

3. Sourceコマンドを使用する際、Bashになっていない

test_cron
# bashになっていることを確認する
SHELL=/bin/bash

以上