Upstart/Systemdがあるにも関わらずなぜmonitが必要なのか
はじめに
Linuxの各種ディストリビューションには、UpstartやSystemdがデフォルトでインストールされていることが多い。 たとえば、Ubuntuでは14系ではUpstartが標準装備されているし、15系以降ではSystemdが標準装備になる。
UpstartもSystemdのどちらも、管理するプロセスが死んだときに、死んだプロセスを再起動する仕組みを備えている。 たとえば、Upstartであればrespawnというキーワードを仕込んでおけば、再起動する動作をしてくれる。 具体的な設定なこんな感じ:
description "サービスの説明とか"
author "名前と連絡先"
start on runlevel [2345]
stop on runlevel [016]
chdir /hogehoge/
exec foorbar
respawn
本題:なぜmonitが必要なのか?
予期せぬ理由でプロセスが死んだときに、適切な処置を施すようにプロセス監視は必須だ。 Upstartのrespawnは1つのその仕組として使える。 この記事の本題は、なぜupstartがあるにも関わらず、monitやdaemontoolsが必要なのか?という点だ。 (本記事では特にmonitについてフォーカスして紹介する)
回答:monitはより高度な状態確認を提供するからだ
たとえばWebサービスのアプリケーションロジックを提供するプロセスを監視したい場合、 単にプロセスの生存監視をするだけでは十分ではない。 すなわち、プロセスとしては一見、生きているように見えるが、 HTTPに対するレスポンスが返ってこないなど、 ビジネスロジックとして考えれば死んでいるも同然の場合がある。 このようなケースは、Upstartでは拾うことができない。
そこで、monitのようなより高度なプロセス監視ツールが必要になる。 monitでHTTPレベルの死活監視を行うなら以下のような設定を仕込めば良い。
if failed port 80 protocol http
request "/index.html"
with timeout 10 seconds
(..以下略..)
おまけ
個人的には、以下の2つ目の回答にもあるように、Upstart/Systemd と monit を併用するのが良いと思う。 なぜかというと、それぞれの目的が異なるから。基本的なところはUpstart/Systemdにまかせて、 粒度の細かい監視はMonitなどの別の監視を利用するのが良いと思う。