«前の日記(2011-12-03) 最新 次の日記(2011-12-14)» 編集

meta's blog - The Power To Serve

筆者について

FreeBSDを通じてOSSにささかな貢献を。

OSS活動をご支援いただける方を募集しています


2011-12-05 Cannot 'start' sendmail の裏側

Cannot 'start' sendmail の裏側

初心者もOK! FreeBSD質問スレッド その111の sendmail に関する話題のまとめ。

/etc/rc.d/sendmail stop したら start できなくなってしまったという思い込みが発端。

948 :名無しさん@お腹いっぱい。:2011/12/05(月) 10:44:01.58
   FreeBSDのデフォルトのメール配送ってどうなってるの?
   sendmail走ってたから
   /etc/rc.d/sendmail stop
   したらstartでけんくなってしまいますた。
   defaults/rc.confみてたんだけどよくわからず。再起動すべきかとちょっと悩んでみたり。
   どのスクリプトとか見たら良いですか?

ポイントとなるのは /etc/rc.d/sendmail のこの部分。

# If sendmail_enable=yes, don't need submit or outbound daemon
if checkyesno sendmail_enable; then
        sendmail_submit_enable="NO"
        sendmail_outbound_enable="NO"
fi

# If sendmail_submit_enable=yes, don't need outbound daemon
if checkyesno sendmail_submit_enable; then
        sendmail_outbound_enable="NO"
fi

sendmail_enable="YES|NO" という変数は

  • sendmail_submit_enable
  • sendmail_outbound_enable
  • sendmail_msp_queue_enable

という3つの変数の YES,NO を切り替えるのに使われているだけで、 sendmail_enable だけで sendmail のオンオフすべてを切り替えているわけではない。sendmail_enable は inbound 即ち外部からのメールを受け取るのに使用される変数。詳しくは man rc.sendmail を参照。

ところが rc.d/sendmail の15行目で呼んでいる /etc/rc.subr の659行目あたりでは

if ! checkyesno ${rcvar}; then
        if [ -n "${rc_quiet}" ]; then
                return 0
        fi
        echo -n "Cannot '${rc_arg}' $name. Set ${rcvar} to "
        echo -n "YES in /etc/rc.conf or use 'one${rc_arg}' "
        echo "instead of '${rc_arg}'."
        return 0
fi

と書かれていて、[/usr/local]/etc/rc.d/foobar start などとした場合には rc.conf の foobar_enable 変数の値をチェックするようになっているので sendmail_enable="YES" でなければ

Cannot 'start' sendmail. Set sendmail_enable to YES in /etc/rc.conf or use 'onestart' instead of 'start'.

という警告が出てしまう。しかし、先に述べたように sendmail は sendmail_enable だけで制御しているわけではないのでこれは必ずしも適切な警告ではない。

一方 /etc/defaults/rc.conf に書かれているデフォルト設定では

sendmail_enable="NO"    # Run the sendmail inbound daemon (YES/NO).
sendmail_submit_enable="YES"    # Start a localhost-only MTA for mail submission
sendmail_outbound_enable="YES"  # Dequeue stuck mail (YES/NO).
sendmail_msp_queue_enable="YES" # Dequeue stuck clientmqueue mail (YES/NO)

となっていて、rc.conf に sendmail に関する記述を特にしていない場合に /etc/rc.d/sendmail start すると警告が出つつも sendmail はメール送信専用で起動するというわけ。

一連のやりとりすべて

948 :名無しさん@お腹いっぱい。:2011/12/05(月) 10:44:01.58
   FreeBSDのデフォルトのメール配送ってどうなってるの?
   sendmail走ってたから
   /etc/rc.d/sendmail stop
   したらstartでけんくなってしまいますた。
   defaults/rc.confみてたんだけどよくわからず。再起動すべきかとちょっと悩んでみたり。
   どのスクリプトとか見たら良いですか?
949 : 忍法帖【Lv=7,xxxP】 :2011/12/05(月) 11:39:52.62
   目的は何なの?
   start出来ればいいのか、startはどうでもよくてFreeBSDのメール配送の仕組みを知りたいのか、どっち?
950 :名無しさん@お腹いっぱい。:2011/12/05(月) 12:47:13.26
   わかりにくくてごめんなさい。
   defaults/rc.conf通りのまま/etc/rc.d/sendmail startしたらsendmail_enable=YESにしろって怒られて、
   これで良いのかよくわからなかったので聞きました。
   そしてsendmailが落ちてるホストでメールが送れなくて困ってました。

   でも何かしらかsendmail: Queue runnerとかっていうのが起動したみたいでメールも送れるようになり、コレでいいのかな、って思ってます。
951 :名無しさん@お腹いっぱい。:2011/12/05(月) 13:31:55.47
   # /etc/rc.d/sendmail stop
   Stopping sendmail.
   sendmail_submit not running? (check /var/run/sendmail.pid).
   Stopping sendmail_clientmqueue.
   # /etc/rc.d/sendmail start
   Cannot 'start' sendmail. Set sendmail_enable to YES in /etc/rc.conf or use 'onestart' instead of 'start'.
   # /etc/rc.d/sendmail status
   sendmail is running as pid 92163.
   sendmail_submit is running as pid 92163.
   sendmail_clientmqueue is running as pid 92167.
   # grep sendmail /etc/rc.conf
   #
952 :名無しさん@お腹いっぱい。:2011/12/05(月) 14:09:35.86
   >>951
   そんな感じで、
   > Cannot 'start' sendmail. Set sendmail_enable to YES in /etc/rc.conf or use 'onestart' instead of 'start'.
   ってあったからこりゃダメなんだー、って思ってました。問題なさそうだったんですね。ありがとうございます。
955 :名無しさん@お腹いっぱい。:2011/12/05(月) 16:41:34.72
   >>953
   書いてある通りじゃなかったから質問したんじゃない?
   通常rc.confにfoobar_enable="YES"と書いてないサービスは
   onestartで上げなきゃいけないけど、sendmailはその例外でstartでも上がる。
956 :名無しさん@お腹いっぱい。:2011/12/05(月) 16:56:57.43
   startできないって書いているようにみえたが、startしてるのにstartしてないと思い込んだってことか。
957 :名無しさん@お腹いっぱい。:2011/12/05(月) 16:57:36.14
   そのfoobarの部分と起動するコマンドがsendmailということに関係は無いし。
   sendmail_enableはsendmail_submit_enable, sendmail_outbound_enable, sendmail_msp_queue_enableの
   YES NOの書き換えに使われてるだけw
958 :名無しさん@お腹いっぱい。:2011/12/05(月) 17:04:48.14
   /etc/rc.d/sendmailみればわかるけどわかりにくいな。
959 :名無しさん@お腹いっぱい。:2011/12/05(月) 17:49:54.10
   /etc/rc.d/sendmailにonestartやforcestartを使ったら死にそうな気もするがw
968 :名無しさん@お腹いっぱい。:2011/12/05(月) 23:28:20.70
   >>957
   関係ないのに sendmail_enable="YES" かどうかを start 時に見てて
   YES じゃなければ onestart しろよって出すのは間違いだよねってことじゃね?
969 :名無しさん@お腹いっぱい。:2011/12/05(月) 23:47:13.01
   なんちゃら_enableがYESじゃなかったら警告を出してるのは/etc/rc.subrで、
   sendmailの場合はsendmail_enableそのものじゃなくて>>957の変数で制御してるんだけど
   rc.subrはそこまで考慮してなくて警告出しちゃう。

   defaults/rc.confではsendmail_enableはNOだけどsendmail_submit_enable,
   sendmail_outbound_enable, sendmail_msp_queue_enableはYESになっていて、
   rc.d/sendmail はこの3つを見てるから、rc.confにsendmailに関して何も書いていない
   場合は警告が出つつもstartでsendmailが上がるというからくり。

   間違ってたら適当に補足してください。