設定している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が ファイルを見れていない、といった感じ。
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を使った方が良い、という議論もあります。
ただ、一つのスクリプトを実行させたいだけでも20行程度の記述が必要になり、 cronジョブに比べるとかなり面倒。
わざわざ使う必要はない気がしています。
メールを送ったりするのも面倒?
この記事自体はものすごく古いものなので多分いまは状況が違うと思いますが。
まとめ
おそらくならかのセキュリティ強化が原因だとは思うのですが、 Macでcronジョブを設定して出力を直接メールで送ろうとしてもどうやっても送られない状態になっています。 多分macOS Mojaveから。
とりあえずmail
コマンドを直接使えば送れるのでそれで代用します。