-100p

-10p

+10p

+100p

cronでスクリプトの定期実行

Linuxのcronを使って定期的にシェルスクリプトを実行する方法

関連ページ 参考URL
SSL で面倒なのが定期的に証明書からkeystoreを更新するコマンドを打つ必要があること。
この更新コマンドをどうにか自動化できないか調べていた。
その結果Let's Encryptを使っているなら renewal-hooks を使えば良いことが分かったが、同時に調査の過程でcronというものも知った。

別に今はcronを使ってないもののcron自体は汎用性が高い。コマンドの自動化で今後使いそうなのでそのメモ。

cronによる毎分のコマンド実行

cronは細かにコマンド実行日時を指定できる。しかしまずはシンプルな毎分実行を試していく。

cronはLinuxに標準搭載されていて、crontab -eでその内容を編集できる。
ただし自分の環境では管理者権限じゃないと機能しなかった。なのでコードは次のようになる。
sudo crontab -e

一番最初にcronを開いたとき、環境によってはテキストエディターを選択しろという反応が返ってくる。
自分はviを使ってるのでここでは2を選択した。

ここで設定を間違っても、のちにselect-editorと打ち込めばいつでも変更できる。

cronを開くと、初期状態では次のようになってるはず。20行以上の説明文がずらっと書いてある。

この説明文の下にcronの設定を書く。

cronの基本的な構文は次のようになる。
* * * * * 
 [実行したいコマンド] 
最初は最もシンプルなコマンドで試したくてecho testと打ち込んでみたが、cronはechoには対応していなかった。
なのでここではファイル作成のtouchでcronを試していく。
* * * * * touch /test/a


上のコードを書き込みファイルを保存して閉じると、1分ごとに/testディレクトリにaというファイルが作成される。

cronによる指定タイミングのコマンド実行

最初の5つの*には、cronを定期実行する日時を代入できる。
 1つめの* 
: 実行する分を指定。0~59を代入できる。
 2つめの* 
: 実行する時間を指定。0~24を代入できる。
 3つめの* 
: 実行する日を指定。1~31を代入できる。
 4つめの* 
: 実行する月を指定。1~12を代入できる。
 5つめの* 
: 実行する曜日を指定。0~7を代入できる。0と7が日曜日でダブってる。
見ての通り日時指定の最小単位は分で、秒単位では設定できない。

例えばcronで下のように打ち込むと、毎時間30分にaというファイルを作成する。
30 * * * * touch /test/a
毎日23:30に実行したい場合は次の通り。
30 23 * * * touch /test/a
毎月1日の23:30に実行したい場合は次の通り。
30 23 1 * * touch /test/a
毎年12月1日の23:30に実行したい場合は次の通り。
30 23 1 12 * touch /test/a
毎週土曜のの23:30に実行したい場合は次の通り。
30 23 * * 6 touch /test/a

日にちと曜日の両方に数値を指定していた場合が少し厄介。この場合だけ他と異なりor条件になる。
つまり下のコードの場合、毎月15日あるいは毎月水曜の23:30にコマンドを実行する。
30 23 15 * 3 touch /test/a

またcronは指定日時だけではなく指定間隔でもコマンドを実行できる。
例えば下の例では15分おきにコマンドを実行する
*/15 * * * * touch /test/a

cronによるシェルスクリプトの実行

実行するコードが複数行に及ぶようなものなら、実行内容を シェルスクリプト に書いておいて、cronからそれを呼んだ方が効率が良い。

例えば/testディレクトリにform_cron.shというシェルスクリプトがあったとする。
中身のコードは次の通り。
sudo touch /test/a
sudo cp -f /test/a /test/b

crontabで毎分上記のシェルスクリプトを呼ぶコードは次の通り。
* * * * * sh /test/from_cron.sh
本来シェルスクリプトはsourceでもshでも呼べるはずだが、cronではsource /test/from_cron.shと打ち込んでも実行してくれなかった。
理由は分からないがcronはshで記述する必要がある。

cron編集後、1分後にlsを打ち込むとaとbのファイルが作成されてるのが確認できる。
0
0

-100p

-10p

+10p

+100p