Amazon Linuxでupstartを使ってmonitを止めない方法

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

止めたくないプロセス

サーバを長時間運用していると何かの拍子にプロセスが落ちてしまうことがあります。そんなときのためにプロセスの死活監視をするわけですが、そのプロセス監視が落ちてしまっては困ります。そこで、今回はupstartを使ってアンデットなプロセスの設定を行いたいと思います。Amazon Linuxには最初からupstartの仕組みが入っています。

monitのセットアップ

お手軽プロセス管理の仕組みを提供してくれるmonitを例に挙げます。まずはセットアップから

$ sudo yum update -y
$ sudo yum install monit -y

プロセス監視の設定

プロセス監視の設定ファイルの作成です。今回はApacheの設定を書いてみます。ここではスマートに設定ファイルを作成してみたいと思います。ヒアドキュメントを使って設定ファイルの中身を記述します。1行毎にechoを使わずに書ける点がいい感じです。って、Linux使いの方には常識かもれませんねw。

$ cat << _EOF_ > /etc/monit.d/httpd 2>&1
check process apache with pidfile /var/run/httpd/httpd.pid
      start program = "/etc/init.d/httpd start"
      stop program = "/etc/init.d/httpd stop"
      if 5 restarts within 5 cycles then timeout
_EOF_

monit自体の設定

monit自体の設定情報です。

$ sudo su -
$ cat << _EOF_ >> /etc/monit.conf
set daemon 60 with start delay 60
set httpd port 2812 and
    use address localhost
    allow localhost
    
set logfile syslog facility log_daemon  
_EOF_
$ exit

upstartの設定

monitプロセスが自動起動するようにupstartの設定をします。

$ cat << _EOF_ > /etc/init/monit.conf 2>&1
description "Monit service manager"

start on runlevel [2345]
stop on runlevel [!2345]

respawn
exec /usr/bin/monit -Ic /etc/monit.conf
pre-stop exec /usr/bin/monit -Ic /etc/monit.conf quit
_EOF_

cronの設定

monitでは、連続で観測失敗すると不活性状態になります。そこで、1時間に1回再活性化するcronを書いてみましょう。

$ cat << _EOF_ > cron.txt 2>&1
0 */1 * * * /usr/bin/monit monitor all
_EOF_

cron情報を作成したのでcrontabに追記します。

$ crontab -l > crontab.tmp
$ cat cron.txt >> crontab.tmp
$ crontab crontab.tmp
$ rm crontab.tmp

プロセスが自動的に再起動するか確認する

monitが止まらないことを確認しましょう。

$ sudo monit -t
Control file syntax OK
$ sudo initctl stop monit
monit start/running, process 3807
$ sudo kill 3807
$ sudo initctl status monit
monit start/running, process 3812

アンデットな感じで直ちに立ち上がりますね。

まとめ

今回は、upstartにmonitを登録することで、プロセスが落ちない、または、プロセスが落ちても即座に復帰する仕組みを作りました。今まではinit.dに登録されたプロセスをchkconfigでonにすることで、初回自動起動を行うことができましたが、upstartはさらに細かく挙動を設定することができます。今のところ、Amazon Linux側はinit.dとupstartの両方を見てくれるようなので、今まで通りinit.dで設定する方法を用いつつ、細かいプロセスの挙動を設定したい場合はupstartを使うといった組合せもできると思います。ただし、この仕様はAmazon Linuxの場合ですので、他のLinuxディストリビューションによってはどちらかしか使えないかもしれませんので気をつけて下さい。

参考資料

M/Monit Upstart

UpStartに移行すると何が変わるのか

How can I automatically start a node.js application in Amazon Linux AMI on aws?

monit をupstart形式でrespawn起動させる

Unable to get process to spawn from inittab in Amazon Linux AMI

Amazon EC2でプロセス監視ツールを導入する – monit -