XMailのサービス登録
XMailの自動起動

仮想マシン(CentOS)を再起動すると、XMailが起動していない状態に…。 CentOS7から、サービスの起動方法が変更されたようで、init.dディレクトリに起動スクリプトを置いても、システム起動時に実行されなくなりました。
CentOS7では、サービスの登録や起動はSystemd(システム管理デーモン)によって行われます。 XMail(1.27)はSystemdの機構が出来る前のバージョンなので、Systemdによるサービス登録には対応していません。 このようなケースに対応するため、CentOSでは、init.dに設置された起動スクリプトを実行するための設定ファイルを自動的に生成します。

/run/systemd/ganarator.late/ ディレクトリを見ると、xmail.service があります。 このファイルをサービス型の「ユニットファイル」と呼ぶようです。

ファイルを開いてみると、ExecStartにXMailの起動スクリプトを呼び出すパラメータが設定されているのが分かります。
サービスの登録
ユニットファイルが生成されている、ということは、systemctlがサービスとして認識しているのかどうか。 それを確かめるために、systemctlコマンドでstatus xmail.serviceを指定してみます。

# systemctl status xmail.service
結果は未稼働(inactive)ですが、認識されているようです。 ためしに起動してみましょう。

# systemctl start xmail.service
起動したようなのでtelnetで接続してみたところ、ちゃんと応答しています。 サービスを有効にするために、enableも実行しておきます。
# systemctl enable xmail.service xmail.service is not a native service, redirectiong to /sbin/chkconfig. Executing /sbin/chkconfig xmail on
XMailはNative Serviceではない、と言われ登録できませんでした。 メッセージからは chkconfigに対してxmail onというパラメータを与えているように見えます。
chkconfigは、システム起動時に実行するサービスの有効・無効を設定するためのコマンドのようです。 単独で実行すると一覧が見られるらしいので、実行してみます。

# chkconfig
ここで出てきたのは、netconsoleとnetworkの2つだけでした。 httpdやその他のサービスは、すでにsystemdで管理されるようになっているので、ここには出てこないんですね。
そして、ここで気になるキーワード「SysV」が出てきました。 注記に「この出力は SysV サービスのみであり、ネイティブな systemd のサービスは含まれていません。」とあります。 そういえば、XMailのインストール手順を翻訳しているときに、いまいち意味の分からなかった工程がひとつありました。
-
Use the 'sysv_inst.sh' shell script (from root user) to create SysV boot script - unless your distro has other tools to do this.
「そのディストリビューションにこれをするための他のツールがなければ、 'sysv_inst.sh'シェルスクリプトを使って、Sysvブートスクリプトを作ってね。(rootユーザで実行するんだよ)」
SysVもまた、自動起動に関するキーワードで、プロセスの分類(runlevel)を指定することができるようです。 ざっくりと、はじめに「init.d」があって、そのあとに「SysV」や「chkconfig」が出来て、今は「systemd」に統合されている、という認識でいいのかな。 んで、XMailはinit.dとsysvに対応していて、systemdには未対応。 systemdに未対応の場合、sysvまでは自動的にユニットファイルが作られる、と。
上記のXMailの説明は「init.dが使えなかったら、sysv_inst.shをルート権限で実行すれば、SysV用の起動スクリプトを作りますよ」と理解できます。
試しにsysv_inst.shを実行してみましょう。

# /home/wiz/xmail-1.27/sysv_inst.sh
あら? すでにある、と言われました。
むむ…、だんだん手詰まりになってきたぞ…。
でも、だとしたらなぜchkconfigの一覧に出てこないのだろう? 追加してないから、か…。 じゃぁ、追加してみよう。

# chkconfig --add xmail
サービス xmail は、checkconfig をサポートしていません。
ぐはっ。 対応していない…だと?
あれ…、詰んだ?
XMailの起動スクリプトをchkconfigに対応させる
起動スクリプトをchkconfigに対応させるためには、コメントでchkconfig:とdescription:の2つを記述すればよい、という情報をゲット。 このうち、chkconfig:には、ランレベル、起動時の優先度、終了時の優先度を指定するんだとか。
ランレベルを把握しなければ。
- シングルユーザー(CUI)
- マルチユーザー(ネットワークなし)
- マルチユーザー(CUI)
- 未使用
- マルチユーザー(GUI)
- 再起動
なお、0の場合はシャットダウンを表します。 情報を見渡すと、「2345」を指定しているケースがよくあるので、これでいきましょう。 /etc/rc.d/init.d/にある、networkの起動スクリプトにも「2345 10 90」とあるので、同じに設定すればいいかな。 んじゃ、xmailの起動スクリプトを書き換えます。

# vi /etc/init.d/xmail
descriptionはなんかそれっぽく書いておきました。 説明文だから、なんでもいいと思います。
改めてchkconfigに追加し、リストを確認したらxmailが追加されていました。

# chkconfig --add xmail
# chkconfig
そしたら、systemctlでサービス登録できるかな?

# systemctl enable xmail
うん! 出来ない♪
ってゆーか、chkconfigに登録されたんだったら、これで自動起動するんじゃないか? 一度再起動してみよう。
再起動しました。 ログイン前にホストコンピュータからtelnetで接続しようとしてもつながらなかったので、ファイアウォールを確認したら、チェックした項目(ftp,http,smtp,pop3)がすべて外れていました。

よく見たら、設定のところに「実行時」とあって、選択肢に「永続」が…。 ファイアウォールの設定が戻ってしまったのは、GNOMEをインストールし直したからではなく、ここの設定方法が間違っていたからだったようです。
設定を「永続」にして、ftp,http,smtp,pop3をそれぞれチェック。 永続設定は再起動で有効になるようなので、もう一度再起動します。

CentOSにログインする前にホストコンピュータからtelnetで接続したら、XMailが応答しました。 これで自動起動成功です♪
微調整

流れでhttpd(Apache)のランレベルを調べていたら、起動優先度が15、終了優先度が85となっていました。 ネットワークが確立してから起動し、遮断される前に終了、という優先度にしていると判断。 なので、XMailの優先度も同じく15 85に変更しておきました。
この章のまとめ
- XMailはchkconfigで自動起動させることができる。
- chkconfigに対応させるためには、起動スクリプトにchkconfig:とdescription:が必要。
- ファイアウォールは「永続」にしてから設定しないと再起動で元にもどる。