トラブルシューティング · Ubuntu
Ubuntu の cron がメールを送信しない?理由と代替手段
Ubuntu/Debian VPS で cron の出力メールが届かない理由 — MTA なし、MAILTO、スパムフィルタリング — とより信頼性の高い代替手段。
デフォルトでは、cron はジョブの出力をローカルユーザーにメールします — しかし Ubuntu/Debian の標準的な VPS ではそのメールはたいてい届きません。理由と対処法を説明します。
1. メール転送エージェント(MTA)がインストールされていない
最小構成のサーバーには MTA がないため、cron はメールを渡す先がありません。確認してください。
which sendmail
systemctl status postfix
どちらも存在しない場合、cron の出力は単純に破棄されます。軽量な MTA をインストールできます。
sudo apt update && sudo apt install -y postfix mailutils
# 「Internet Site」(またはスマートホスト経由でリレーする場合は「Satellite」)を選択
2. MAILTO を設定する
cron は設定がない場合、crontab のオーナーに出力を送ります。crontab の先頭に実際のアドレスを設定してください。
MAILTO="ops@example.com"
0 2 * * * /opt/app/run.sh
出力がない場合はメールもありません — cron はジョブが stdout/stderr に書き込んだときのみメールします。
3. メールがスパムとして弾かれている
MTA があっても、ランダムな VPS IP から直接送られたメールは拒否またはジャンクに分類される可能性が非常に高いです: SPF なし、DKIM なし、逆引き DNS なし、IP がブロックリストに載っている可能性も。リアルプロバイダー(スマートホスト/SMTP リレー)経由でリレーすると配信性は改善しますが、設定・維持にそれなりの手間がかかります。
4. エンドツーエンドでテストする
echo "test body" | mail -s "cron mail test" ops@example.com
tail -f /var/log/mail.log
ログにメッセージが遅延またはバウンスと表示される場合、cron の問題ではなく配信の問題です。
cron メールより信頼性の高いアプローチ
cron メールは本質的に脆弱です: 出力があるときのみ発火し、運用が必要な MTA に依存し、スパムに入ります。最悪なのは、ジョブが完全に動かなくなった場合、出力がなく、メールもなく、何も聞こえないことです。
逆転の発想: ジョブが動いたときにメールするのではなく、動かなかったときにアラートを受け取ります。成功時にハートビートを ping して、サービスにサイレンスを監視させてください。
0 2 * * * /opt/app/run.sh && curl -fsS https://ping.steadycron.com/<your-ping-token>
ping が欠落または遅延した場合、SteadyCron がメール(または Slack、ページング)で通知します — ローカル MTA も SPF/DKIM の手間もなく、cron メールが決してできなかったケースも検出します: 発火を停止したジョブ。