【Mac】定期的にスクリプトを実行する crontab

先日、Geektool で定期的にスクリプトを実行する、という記事を書いた。筆者は知らなかったのである、crontab というコマンドがあることを。
 いや本当のこというと知ってはいたのだ。しかし、はじめて試したとき難しくてわかんなかったのである。なんとなく敬遠しているうちに忘れてしまっていた。
 あらためて検索して、いろんな方の記事を読んだら、そこまで難しくもなかった。むしろ、かなり手軽に使える印象ではないか。

vi こわい

crontab を使えば、定期的にコマンドやスクリプトを実行できる。「何分おきに実行」とか、「毎週水曜日の何時に実行」という自動化が簡単な記法で設定できる。

分 時 日 月 曜日 コマンド

こんな感じで設定できるのだ。簡単である。これのなににビビっていたのか。
 設定の編集は crontab -e でおこなえる。実行すると、以下の画面が出てくる。
 わたしをおびえさせたのは、なんといってもこの画面なのであった。

vi である。使えるとかっこいい上級者エディタ、vi である。ドットインストールで勉強してもついに身につかなかったあの憎き vi だ。かつての筆者ならビクビクしてターミナルをクイットし、なんだったら MacBook を再起動したかもしれない。
 いまは冷然と : q と順番にキーを押して vi を終了し、おもむろに以下のように書く。

export EDITOR=nano

これを実行してから、ふたたび、crontab -e を試すと、だいぶフレンドリーな nano というエディタで crontab の設定ファイルを開いてくれるのである。

nano というのもエディタだ。まず 名前が可愛い。むかしは pico とかいっていた気がする。わかりやすいエディタである。いつかは vim やら emacs やら本格的に試してみたいと思わないではないのだが、いまはこれでいい。nano は普通のエディタのようにファイルを扱える。くどいようだが名前が可愛い。cv:田村ゆかりって感じだ。

なお export の設定はターミナルを再起動させると、ちゃんと vi に戻るので安心だ。

試してみる

とりあえず、開かれた crontab の設定に以下のように書いてみた。

40 11 4 3 * echo 'baka'

3 月 4 日の 11 時 40 分、曜日は何曜日でもいいので echo で baka と罵しってください、という設定である。
 nano における文書の保存は control + o である。保存場所を訊かれるが、なにも変更せずにリターンを押す。終了は、control + x。nano のいいところは、操作が下のほうに書いてあるところである。

crontab: installing new crontab

というメッセージともに、下のようなダイアログがあらわれるので、OK する。

ドキドキしながら時間を待つ。さぁ、罵しってくれ、と思っているのに、なにも起きない。それもそのはず、crontab の出力はメールで届くのだ。
 ターミナルで mail と打ちこんでリターンを押す。

Mail version 8.1 6/6/93.  Type ? for help.
"/var/mail/user": 1 message 1 new
>N  1 user@MacBook.  Mon Mar  4 11:40  19/674   "Cron <user@Mac"
?

なんか届いてる。カーソルは?のところで点滅しているので、新着メールの番号「1」を入力すると、中身が読める。

Message 1:
From user@MacBook.local  Mon Mar  4 11:40:00 2019
X-Original-To: user
Delivered-To: user@MacBook.local
From: user@MacBook.local (Cron Daemon)
To: user@MacBook.local
Subject: Cron <user@MacBook> echo 'baka'
X-Cron-Env: <SHELL=/bin/sh>
X-Cron-Env: <PATH=/usr/bin:/bin>
X-Cron-Env: <LOGNAME=user>
X-Cron-Env: <USER=user>
X-Cron-Env: <HOME=/Users/user>
Date: Mon,  4 Mar 2019 11:40:00 +0900 (JST)

baka

?

確かに罵しられている。?がついて、いくらか尻上がりな口調で馬鹿にしてきている。
 x で mail コマンドを終了できるが、baka メールは受信ボックスに残り続ける。q ならメールを保存して終了となる。保存場所はホームか、カレントディレクトリらしい。mbox というファイル名で出力される。
 mail については下記のサイトさまを参考にしました。

🔗 コマンドラインでメール閲覧や送信を行う – Qoosky

エラーの場合もメールで知らせてくれる。
 また、echo 'baka' > ~/Desktop/baka.txt とやれば、好きなところにメッセージを出力できる。

時刻の設定

crontab -e でもっといろいろ設定してみる。
 下記サイトさまに、非常にすぐれた例文がある。

🔗 Macでcron。 | DevelopersIO

0/15 10-13,15,17 1 * sun ls -l

意味は「毎月1日が日曜の場合、10〜13時と15時と17時に、0分から15分間隔でコマンドls -lを実行」。
「/」「-」「,」を使用する事で自在に操れます。

Macでcron。 | DevelopersIO

これを参考に下を試してみた。

0/1 * * * * /Users/user/bin/saykana 'うぇ'

一分ごとにSayKanaコマンドで「うぇ」といってもらう設定である(筆者はホームフォルダの bin というフォルダにインストールしたので、そのように指定している)。
 これが五分おきなら、0/5 だし、三十分おきなら 0/30 ということだろう。
 時間、日、月、曜日は問わないので、ワイルドカードの * を指定している。
 実行すると「うぇ」といってくれて楽しい。

これを一時間おきに「うぇ」といわせるなら、
0 * * * * saykana 'うぇ'
 でいいはずだ。二時間おきならどうだろう。こんなふうに書く。
0 0,2,4,6,8,10,12,14,16,18,20,22 * * * saykana 'うぇ'
 一日おき、一ヶ月おきも同じことだろうと思う。

一分ごとに「うぇ」といってもらって最初は面白かったけど、だんだんどうでもよくなってくる。設定の削除は crontab -r なのだが、これは全消しなので注意。今までの設定もすべて消えてしまう。
 個別に設定を消去するには crontab -e で消すしかないようだ。

バックアップ、書き出し、読みこみ

crontab -l というオプションで設定のリストが表示される。おもしろいことに、これを書き出すことが出来るのだ。

crontab -l > ~/Desktop/crontab

これでデスクトップに設定がバックアップできる。ファイル名は crontab とするものらしい。このファイル、CotEditor などの使いなれたエディタで編集できる。vi だの nano だのに、もうこだわらなくてもいいのである。
 設定を反映させるには、

crontab < ~/Desktop/crontab

とやれば、すでにある設定に上書きしてくれる。
 これらは、下記サイトさまで学んだ。

🔗 MacのHomebrewのアップデートを、cronで自動化する – 楽しいだけで十分です

ということで、ここからは CotEditor で編集していきたい。
 crontab の書類は「#」でコメントできるので、忘れないように書きこんでおくことにした(crontab -l の表示がごちゃごちゃするのでおすすめはしない)。

# crontab オプション「-e 編集」「-l リスト」「-r 全消去」
# 「分 時 日 月 曜日 コマンド」
# 例 0/15 10-13,15,17 1 * sun ls -l
# 毎月1日が日曜の場合、10〜13時と15時と17時に、0分から15分間隔でコマンドls -lを実行
# 分 0〜59、時 0〜23、日 1〜31、月 1〜12、曜日 sun,mon,tue,wed,thu,fri,sat
# 書き出し crontab -l > ~/Desktop/crontab
# 読みこみ crontab < ~/Desktop/crontab

# ラジオ
59 23 * * tue,wed,thu open -a radikoro.app

# テレビ
29 19 * * sun osascript -e 'display notification "ダーウィンがきた"'

# 記念日
0 0 1 1 * say 'あけましておめでとう'
0 0 5 13 * echo -e 'お誕生日おめでとう'

# 掃除
0 0 * * * /Users/user/bin/gototrash.sh
1 0 * * * /Users/user/bin/pixiv_kataduke.sh

自分の誕生日に自分にメールを送っちゃうあたり、薄汚い中年男性が生きていくための知恵がつまっている。
 gototrash.sh というのは「ゴミ捨て場」フォルダにつっこんだファイルが、最終変更日から一週間が過ぎていたらゴミ箱に捨てるというもの。
 pixiv_kataduke.sh というのは、ダウンロードフォルダに溜まった pixiv の美麗な絵を片付けるスクリプトである。
 シェルスクリプトはパスを入れて書いてあげないと動かない。

月初めは日にちを 1 にして月を * にすればいいとわかった。月末はどうするのか。ちゃんとやり方があるようだ。

🔗 [linux]月末にcronを実行する – hello-world.jp.net

それにしても、こうしてみると、寂しい一週間、いや、一年である。
 なので記念日を見つけては crontab なり、リマインダー.app なりで自分に対するにお祝いの言葉を仕掛け、MacBook に無理矢理いわせていこうと思っている。