BLOGTIMES
2017/06/17

CentOS 7 で自分でビルドした apache を使うと systemctl start が戻ってこない

  httpd24  centos7 
このエントリーをはてなブックマークに追加

CentOS 7 に自分でビルドした apache 2.4 をインストールしてみたのですが、systemd 経由でデーモンを起動させようとすると変な挙動をするので困ってしまいまいた。具体的な現象としては、以下のコマンドを実行するとコンソールが戻ってこない&起動に失敗するというもの。

systemctl start httpd

原因はサービス定義の Type の部分

httpd.service の定義は CentOS 7 のデフォルトのものを参考にしましたが、それがまずかったようで他のデーモンを参考に「Type=notify」の部分を「Type=simple」に直すとうまく起動するようになりました。

これでやりたかったことは達成なので、ひとまず「めでたし、めでたし」という感じですが、問題はこの原因となった Type=notify が何をやっているかということ。
おそらく将来的にもハマりそうな部分なので、ちょっと詳しく調べておきます。

sd_notfy() と mod_systemd.so

まず、RHEL7 の systemd のマニュアルを確認してみると、Type=notify について以下の記述が見つかりました。

9.6. システムのユニットファイルの作成および変更 - 表9.10 [Service] セクションの重要なオプション

notify – このタイプは simple と同様ですが、結果として生じるユニットは、通知メッセージが sd_notify() 関数で送信された後にのみ起動します。

この sd_notfy() について調べてみると、これが systemd/sd-daemon.h に定義されている関数であると分かります。以下の最後の部分に書いてあるように、デーモンの起動が完了した通知を掌っているみたいなので、これがないと systemd 側ではデーモンが正常起動したかどうか分からないんですね。というか、通知が来るまで待ちに入ってしまうので、ターミナルが戻ってこなくなるということのようです。

sd_notify

sd_notify() may be called by a service to notify the service manager about state changes. It can be used to send arbitrary information, encoded in an environment-block-like string. Most importantly, it can be used for start-up completion notification.

これは systemd 側の都合によるものなので、標準の Apache にこんなものは入ってないはず・・・と思って調べてみたら、CentOS 7 の apache には mod_systemd という専用のモジュールが組み込まれているようです。2.5 のマニュアルはある*1のですが、現行の 2.4 には同梱されていないようなので、CentOS 7 の rpm から以下のようにちょっと拝借すれば、Type=notify でも正常起動するということが分かりました。

LoadModule /etc/httpd/modules/mod_systemd.so

やっぱり systemd 一筋縄ではいきませんね。


トラックバックについて
Trackback URL:
お気軽にどうぞ。トラックバック前にポリシーをお読みください。[policy]
このエントリへのTrackbackにはこのURLが必要です→https://blog.cles.jp/item/9413
Trackbacks
このエントリにトラックバックはありません
Comments
愛のあるツッコミをお気軽にどうぞ。[policy]
古いエントリについてはコメント制御しているため、即時に反映されないことがあります。
コメントはありません
Comments Form

コメントは承認後の表示となります。
OpenIDでログインすると、即時に公開されます。

OpenID を使ってログインすることができます。

Identity URL: Yahoo! JAPAN IDでログイン