- blogs:
- cles::blog

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


CentOS 7 に自分でビルドした apache 2.4 をインストールしてみたのですが、systemd 経由でデーモンを起動させようとすると変な挙動をするので困ってしまいまいた。具体的な現象としては、以下のコマンドを実行するとコンソールが戻ってこない&起動に失敗するというもの。
† 原因はサービス定義の 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 でも正常起動するということが分かりました。
やっぱり systemd 一筋縄ではいきませんね。
このエントリへのTrackbackにはこのURLが必要です→https://blog.cles.jp/item/9413
古いエントリについてはコメント制御しているため、即時に反映されないことがあります。
コメントは承認後の表示となります。
OpenIDでログインすると、即時に公開されます。
OpenID を使ってログインすることができます。
2 . 福岡銀がデマの投稿者への刑事告訴を検討中(110733)
3 . 年次の人間ドックへ(110337)
4 . 2023 年分の確定申告完了!(1つめ)(109889)
5 . 三菱鉛筆がラミーを買収(109789)