pythonで自動化が進んでますか?
タスク処理は.py コードで実装できるようになった後に悩むことは、ローカル環境での自動化ではないでしょうか?
GASだったらTrigerがあるのにぃと悩む方もいるかもしれませんが、当然似たような機能をローカル環境でも実装可能です。
その際に一般によく利用されるのがcron/crontabです。実はMACではlaunchdが標準になっており、cronは推奨から外れてはいますが、いまだに知名度はcronの方が高いかなぁと思います。launchd使われたい方は以下の記事をどうぞ。
そして、cronの方がlaunchdに比べて、非常にシンプルです。
そんなcronでもつまづくケースがあるので、何個かメジャーなエラーケースと対応策をリストアップしてみました。
エラーパターン
前提環境
macOS: Catalina version10系
フルディスクアクセスが付与されていない
基本的にうまく動作していない場合に一番最初に設定もれが起きていないか確認するのは以下です。
cronがそもそもアクセスできていない問題
対応策は以下です。
【システム環境設定】->【セキュリティとプライバシー】->【フルディスクアクセス】で、/usr/sbin/cronにフルディスクアクセスを付与


ロックを解除して、プラスボタンを押すと権限付与する対象を選択可能


権限を付与する対象
/usr/sbin/cronに付与すれば大丈夫です。
rootが探せ出せない場合、macではshift+ command + gで探すことが可能です。そこに上のpathを入力すれば対象設定できます。
エディターの設定の問題
エディターが設定されていないから、エラーが生じる場合もあります。
生じるエラーメッセージ
crontab: "/usr/bin/vi" exited with status 1
viでエディットしようとしてるケース。status1っていうのが、エディター設定されてないケースを意味している。
対応策
export EDITOR=/usr/bin/vim
により、エディターを変更
エディターを指定してあげることで、エラーは解消されます。
cronのログ確認方法
そもそもどんな状況になっているのかを確認するにはエラーログをとるのが一番早いです。ということで、エラーログの取得方法の紹介。
標準出力及びエラー標準出力で成功(1>>)とエラー(2>>)それぞれlogを取得します。/var/logにアクセス権がない場合は、chomdで権限付与することが必要。
(command) 1>> /var/log/exec.log 2>> /var/log/error.log
とりあえずシンプルにechoで試してみると良いことが多い
cronの実行をログファイルで見るのも良いですが、とりあえずメールに連絡させてみると早いです。MAILTOで自分のアドレスを登録すると、メールが飛んできます。送付元はCron Daemon(デーモン→悪魔の方のデーモンじゃなくて、守護者?だったかなの方のデーモン)です。
MAILTO= ***@gmail.com
* * * * * echo “hoge” 2>>error.txt
結果

hogeとメールがきていることが確認できれば、crontabがうまく動作していることは確認できます。
crontab -eの代わりにconfファイルを読ませる
crontab [file path]で、crontabに直接書き込むことなく、他のファイルで作成したcrontabの内容を設定することができます。こっちの方が後からの変更が楽です。
crontabの時間設定でのエラーパターン
こんなエラーが出る場合があります。何が起きているのでしょうか?
"test2_cron.conf":0: bad minute crontab: errors in crontab file, can't install
見ての通りbad minuteとなっていますね、ということはminuteの部分、crontabで時刻設定をする最初の部分が間違っているよという話です。
エラーメッセージを見れば、crontabでの時間設定でのエラーは特定可能です。
crontabの環境設定を確認してみる
そもそもcrontabを動かす環境が初期設定で何が含まれいるのか確認すると、不足している要素(例えばpythonファイルを動かしたいときのpython versionなど)がわかります。
手順は以下です。
1.確認用コード(crontab -eして)
* * * * * env >/tmp/cron_env
2. outputされたものを確認
less /tmp/cron_env
3. 結果を確認してみます。含まれていたものは以下です。
SHELL=/bin/sh USER=sugimurakazuya PATH=/usr/bin:/bin PWD=/Users/sugimurakazuya SHLVL=1 HOME=/Users/sugimurakazuya LOGNAME=sugimurakazuya _=/usr/bin/env
非常に少ないことがわかると思います。必要に応じて追加が必要ですね。
pathを作るときの注意事項:home directory(ホームディレクトリ)ってどこ?
実行させるcrontabの指定では、基本フルpathを付与する必要があります。フルpathが必要ってことは、元々のhome directoryが何かを把握しておく必要もありますよね。
シンプルには、ローカルFinder等で【移動】→【ホーム】で移動してもらえればわかります。
pathとしては、以下のようになっているはずです。
path: /Users/[mac bookの名前]
がホームディレクトリのpathを意味しています。
usrではなく、Usersであることに注意してください。
terminalを立ち上げた時に最初に出る部分ってだけですね。