読者です 読者をやめる 読者になる 読者になる

ITを基礎からやってくブログ

とにかく基礎からやってくんです。基礎が大事なんです。

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でトラブル時は、環境変数の問題であることが多い、とのこと。

CentOSでcronからphp mail送れない - Linux系OS 締切済 | 教えて!goo

コマンド内で環境変数じみている箇所は、、、

-S nss-config-dir=~/cert \

ここですね。エラーメッセージとも一致します。

チルダ(~)って環境変数扱いなんだっけ?と思って調べたら、 下記の記述を発見。

bashのチルダ展開、~ と ~name の違い – Imai blog

自分でも試してみた。

/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からメール送信が問題なくできるようになりました。