Linuxのcronを使って定期的にシェルスクリプトを実行する方法
関連ページ
参考URL
SSL
で面倒なのが定期的に証明書からkeystoreを更新するコマンドを打つ必要があること。
この更新コマンドをどうにか自動化できないか調べていた。
その結果Let's Encryptを使っているなら
renewal-hooks
を使えば良いことが分かったが、同時に調査の過程でcronというものも知った。
別に今はcronを使ってないもののcron自体は汎用性が高い。コマンドの自動化で今後使いそうなのでそのメモ。
cronによる毎分のコマンド実行
cronは細かにコマンド実行日時を指定できる。しかしまずはシンプルな毎分実行を試していく。
cronはLinuxに標準搭載されていて、crontab -eでその内容を編集できる。
ただし自分の環境では管理者権限じゃないと機能しなかった。なのでコードは次のようになる。
一番最初にcronを開いたとき、環境によってはテキストエディターを選択しろという反応が返ってくる。
自分はviを使ってるのでここでは2を選択した。
ここで設定を間違っても、のちにselect-editorと打ち込めばいつでも変更できる。
cronを開くと、初期状態では次のようになってるはず。20行以上の説明文がずらっと書いてある。
この説明文の下にcronの設定を書く。
cronの基本的な構文は次のようになる。
最初は最もシンプルなコマンドで試したくてecho testと打ち込んでみたが、cronはechoには対応していなかった。
なのでここではファイル作成のtouchでcronを試していく。
上のコードを書き込みファイルを保存して閉じると、1分ごとに/testディレクトリにaというファイルが作成される。
cronによる指定タイミングのコマンド実行
最初の5つの*には、cronを定期実行する日時を代入できる。
見ての通り日時指定の最小単位は分で、秒単位では設定できない。
例えばcronで下のように打ち込むと、毎時間30分に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