mac cronがうまく動作しない場合

cron 業務効率化
この記事は約5分で読めます。

pythonで自動化が進んでますか?

タスク処理は.py コードで実装できるようになった後に悩むことは、ローカル環境での自動化ではないでしょうか?

GASだったらTrigerがあるのにぃと悩む方もいるかもしれませんが、当然似たような機能をローカル環境でも実装可能です。

その際に一般によく利用されるのがcron/crontabです。実はMACではlaunchdが標準になっており、cronは推奨から外れてはいますが、いまだに知名度はcronの方が高いかなぁと思います。launchd使われたい方は以下の記事をどうぞ。

そして、cronの方がlaunchdに比べて、非常にシンプルです。

そんなcronでもつまづくケースがあるので、何個かメジャーなエラーケースと対応策をリストアップしてみました。

Advertisements

エラーパターン

前提環境

macOS: Catalina version10系

フルディスクアクセスが付与されていない

基本的にうまく動作していない場合に一番最初に設定もれが起きていないか確認するのは以下です。

cronがそもそもアクセスできていない問題

対応策は以下です。

【システム環境設定】->【セキュリティとプライバシー】->【フルディスクアクセス】で、/usr/sbin/cronにフルディスクアクセスを付与

apple icon-> システム環境設定→セキュリティとプライバシー
フルディスクアクセス

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

権限を付与する対象

/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を立ち上げた時に最初に出る部分ってだけですね。

コメント