cronでメール送信時にNSS関連のエラー
CentOS6.5にて、mailコマンドでメールを送るシェルをcronで動かしていたのだけど、 メールが来ない事象が発生。
- コマンド
mail -v -s "タイトルほげほげ" \ -r xxxxxxxxxxxxx@gmail.com \ -S smtp-use-starttls \ -S smtp=smtp://smtp.gmail.com:587 \ -S smtp-auth=login \ -S smtp-auth-user=xxxxxxxxxxxxx@gmail.com \ -S smtp-auth-password=yyyyyyyyyyyyyyyyy\ -S nss-config-dir=~/cert \ -S ssl-verify=ignore \ xxxxxxxxxxxxx@gmail.com
- エラー内容
Error initializing NSS: Unknown error -8015.
シェルを直接叩くと正常に送信されるので、cronの問題だと思って調査したところ、 原因が2つ判明。
1. 環境変数
cronでトラブル時は、環境変数の問題であることが多い、とのこと。
コマンド内で環境変数じみている箇所は、、、
-S nss-config-dir=~/cert \
ここですね。エラーメッセージとも一致します。
チルダ(~)って環境変数扱いなんだっけ?と思って調べたら、 下記の記述を発見。
自分でも試してみた。
/etc/crontab
* * * * * root echo "1" ~ >> /root/cronlog * * * * * root echo "2" ~root >> /root/cronlog * * * * * root echo "3 $HOME" >> /root/cronlog
実行結果
1 / 2 /root 3 /
上記記事と同様、~と$HOMEは/を、~rootは/rootを示しました。
cron内では、明示的にパスを書く、またはチルダの後に明示的にユーザ名を書くほうの記載をする必要があるようです。
-S nss-config-dir=/root/cert \
または
-S nss-config-dir=~root/cert \
2. SELinux
Bug 919038 – SELinux is preventing /usr/bin/mailx from 'write' accesses on the directory /.
出た。何かと邪魔してくるSELinux。いやセキュリティ必要なところならいいことなんだけど。
今回はセキュリティはほぼ気にする必要のないローカル環境だったのでオフ。 ていうかなんで有効のままにしてたんだろう。
setenforce 0
以上でcronからメール送信が問題なくできるようになりました。