この前、まつもとりーさんに自分でも忘れていたpostfix-mrubyというのを発掘されて、
Postfix-mruby最高!
— 松本 亮介 / まつもとりー (@matsumotory) 2018年2月22日
これによって、前に作ろうと思ってそのまま忘れてたものを思い出したので、作ってみました。
こんなプログラムを /usr/lib/postfix/sbin に置いておいて、
require 'postfix_daemon' PostfixDaemon.start do |socket, addr| while s = socket.gets socket.puts s.update end end
Postfix の master.cf にテキトーに書くと、ポートにアクセスがあると Postfix の master(8) に起動してもらえます。
まあ master を inetd のように使ってる感じです。標準入出力ではないですけど。
シングルスレッドなので一つの接続を処理中はそのプロセスは新しい接続には応えることができませんが、その場合は Postfix の master が新たなプロセスを生成してくれます。これも inetd と同じです。
メールの配送に関係するデーモンを作った時に独自に起動管理する必要がないというメリットもあります。
Postfix の master を inetd のように使うというと、spawn(8) が用意されています。これは標準入出力でクライアントと通信できるので、本当に inetd ぽいです。普通は spawn を使うのが簡単でいいと思います。
ただし spawn は接続があった時にプロセスを生成し、切断された場合にプロセスが終了するので、Ruby のようにプロセス起動が重めなプログラムの場合は、繰り返し使われるとそれなりに負荷が掛かってしまいます。
Postfix のデーモンとすることで、一度起動されたら接続が切れてもしばらくは、死なずに次の接続を待つことが出来ます。アクセス頻度が高い場合でも spawn に比べて負荷があがりにくいんじゃないかと思ってます(測ってない)。
(これ書いてて思ったけど PostfixService という名前の方が良かったかも知れない…)