rcmdnk's blog

最新モデル Apple MacBook Pro (13インチPro, Touch Bar, 1.4GHzクアッドコアIntel Core i5, 8GB RAM, 256GB) - スペースグレイ

macOSでcronジョブを使って定期的に色々実行しているのですが、 その出力がメールに送られなくなっていました。

設定しているcronジョブ

設定しているのは dotfiles などをまとめて管理している設定ファイル群のアップデートや ポートフォワード設定など。

これらは基本的に失敗しなければ何も出力しないようになっていて、 失敗した場合には標準出力/エラー出力に出させてそれをcronが拾ってメールで送る様な設定になっています。

cronの設定で

[email protected]

みたいに明にメールの送り先も指定しています。

Macでのメール設定に関しては以下を参照。

これにあるように設定して、例えば

echo content |mail -s "title" [email protected]

みたいにメールコマンドを使うとたしかに送ることが出来る状態にはなっています。

メールが送られない

普段あまり失敗しないスクリプトなので、余り気にしてなかったのと、 実際にアップデートなどは行われていたのでジョブ自体が動いているという認識はありました。

ただ、たまに設定ファイルのアップデートが失敗していて、ちょっと変更が必要な状態に居続けているにも 関わらずメールが来てないな、というときはありました。 こういったこともあまりないので、気づいたときに手で直してまたcronジョブに頼る、という状態に。

で、最後にこういったメールが送られてきたのはいつか、と調べてみると2018/02/06…

かなり長い期間なのでひどいものですが、改めてどうやっても送られてないことを確認したので色々調べ始めてみました。

変わったこと

Macに関しては2017年9月にHigh Sierra(10.13)にアップグレード、 2018年4月に新しいMacに移行、2018年9月にMojave、2019年10月にCatalinaにアップグレードしています。

どこかOSのアップグレードで、と思ってたんですが、時期的にはMacを新しくした段階から来てない、といった感じ。

ただ、たまたま数ヶ月出力がない、ということも無いではないので、下の話とかを見る限りでは macOS Mojaveになった事が原因かな、とは思ってます。

この間いろいろあって、Mojaveになった段階でセキュリティーアップグレードで crontab -eなどのコマンドがターミナルでOperation not permittedとか出るようになりましたが、 システム環境設定のセキュリティーとプライバシーの部分でターミナルなどのアプリに アクセス権を与えることで編集できるようになります。

この辺は対応済で、また上に書いたように設定していたcronジョブはちゃんと動いていました。

一方、Mojaveから設定されているジョブ自体が走らない、という話もあり、 そういった場合はスクリプトがセキュリティで制限がかかっている部分にありcronが ファイルを見れていない、といった感じ。

Fixing cron jobs in Mojave - Ricard Bejarano

cronにフルディスクアクセス権限を与えてみる

cronジョブ自体は動いているので上に書いたようなcron自体へのアクセス制限が問題だとは思ってませんが、 とりあえずやってみることに。

システム環境設定のセキュリティーとプライバシーへ行き、プライバシーのタブにあるフルディスクアクセスを開きます。

ここに/usr/sbin/cronを追加します。 方法としては、下の鍵をクリックして認証して、+を押して追加しますが、 Finer形式だと探しにくいので直接--Gを押すと直接フィアルの場所を入力できるのでそこで/usr/sbin/cronを入力して追加します。

で、やってみたのですが特に変わらず。。。

根本的に送れない?

この件に関して、結構大きな問題かと思うんですが同じ状況にいる人が余り見つからなかったのですが、 いくつか見つかったものに関しては解決策はない、といった感じ。

macOS catalina no longer sends email if job outputs to stdout - Ask Different

とうことで、今の所根本的に治す方法が見つかってません。。。

mailを直接使う

cronジョブに使うスクリプトのなかでmailコマンドを使えばメールは送れました。 ただ、それだと普段も使いたいスクリプトだとオプションなどで変更をしなくては行けなくて面倒なので、 やはりcronジョブ側でなんとかしてもらいたい所。

試しに、cronジョブの設定そのものでメールを使ってみると

*/5 * * * * echo "test"|mail -s "cron" [email protected]

ちゃんとメールが来ました。

ただ、これだと(echoの部分をスクリプトにして)スクリプトの出力がないときでも 毎回メールが送られてきて邪魔。

ということで

*/5 * * * * x=$($HOME/test.sh 2>&1); if [ -n "$x" ];then echo "$x"|mail -s "cron" [email protected];fi

というのを試してみましたが、これでちゃんと出力があったときだけメールが送られる様になりました。 また、これだとメールのタイトルも自分で決められるので良いっちゃ良い。

ですが、やはりちょっと見栄えが悪い…

そんなにたくさんあるわけでもないのでこれでも仕方ないかな、と今は思ってますが。

cronのログ

Linuxとかだと/var/log/cronにいつジョブが実行されたとかのログがありますが、 Macだとその辺どこに出ているのか知りません。 ちょっと探した所見つからなかった。。。

Launchdを使う

Macではlaunchdというサービスが動いていて、色々アプリケーションなどの管理を行っています。

この設定で、定期的に実行したりすることも指定できるので、Macであれば cronを使わずにlaunchdを使った方が良い、という議論もあります。

Scheduling Timed Jobs

ただ、一つのスクリプトを実行させたいだけでも20行程度の記述が必要になり、 cronジョブに比べるとかなり面倒。

わざわざ使う必要はない気がしています。

メールを送ったりするのも面倒?

tkoki blog: Mac OS Xでの定期的な処理 - launchdについて

この記事自体はものすごく古いものなので多分いまは状況が違うと思いますが。

まとめ

おそらくならかのセキュリティ強化が原因だとは思うのですが、 Macでcronジョブを設定して出力を直接メールで送ろうとしてもどうやっても送られない状態になっています。 多分macOS Mojaveから。

とりあえずmailコマンドを直接使えば送れるのでそれで代用します。

Sponsored Links
Sponsored Links

« LinuxにHomebrewでShellCheckをインストールしたい(が、諦める) macOS Catalina 10.15.3 (19D76)にアップデート »