【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
でもっといろいろ設定してみる。
下記サイトさまに、非常にすぐれた例文がある。
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 に無理矢理いわせていこうと思っている。
ディスカッション
ピンバック & トラックバック一覧
[…] りやすかったです。ありがとうございました。 【Mac】定期的にスクリプトを実行する crontab | 林檎コンピュータ […]