Amazon Linux 2 で monit で何らかのプロセスを監視させるとき、そのプロセスの PID ファイルを指定する(PID ファイルじゃなくても出来るのだが)。
Amazon Linux 1(以下 amzn1)では lsyncd 使ってるときに /var/run/lsyncd.pid
が作成されてた気がするんだけど Amazon Linux 2(以下 amzn2)にしてから /etc/lsyncd.conf
で pidfile =
を指定しても作成されなかったのでちょっと確認することにした。
まずはそれぞれの実行状態。
$ ps w -C lsyncd PID TTY STAT TIME COMMAND 20806 ? Ss 0:00 /usr/bin/lsyncd -pidfile /var/run/lsyncd.pid /etc/lsyncd.conf
$ ps w -C lsyncd PID TTY STAT TIME COMMAND 20192 ? Ss 0:00 /usr/bin/lsyncd -nodaemon /etc/lsyncd.conf
amzn1 では /usr/bin/lsyncd -pidfile /var/run/lsyncd.pid /etc/lsyncd.conf
となっており、コマンドラインオプションで PID ファイルを指定しているが、amzn2 では -nodaemon
で lsyncd がフォアグラウンドで動くようになっており PID ファイルの指定はされていない。
次に、それぞれの起動設定がどうなってるか確認してみる。
先ずは amzn1 から。
1 #!/bin/bash 2 # 3 # chkconfig: - 85 15 4 # description: Lightweight inotify based sync daemon 5 # 6 # processname: lsyncd 7 # config: /etc/lsyncd.conf 8 # config: /etc/sysconfig/lsyncd 9 # pidfile: /var/run/lsyncd.pid 10 11 # Source function library 12 . /etc/init.d/functions 13 14 # Source networking configuration. 15 . /etc/sysconfig/network 16 17 # Check that networking is up. 18 [ "$NETWORKING" = "no" ] && exit 0 19 20 LSYNCD_OPTIONS="-pidfile /var/run/lsyncd.pid /etc/lsyncd.conf" 21 22 if [ -e /etc/sysconfig/lsyncd ]; then 23 . /etc/sysconfig/lsyncd 24 fi
/etc/init.d/lsyncd
で先ずは LSYNCD_OPTIONS
を設定する。その後、/etc/sysconfig/lsyncd
が存在すればそれを読み込むようになっている。LSYNCD_OPTIONS
はリードオンリーになっていないので /etc/sysconfig/lsyncd
で再度 LSYNCD_OPTIONS=
を定義すれば起動オプションをオーバーライドすることが出来る。
/etc/sysconfig/lsyncd
も用意されているがすべてコメントアウトされている。
# Keep the space there for systemd. Don't nest variables without # changing the systemd service file to use: /usr/bin/sh -c 'eval XXXX' # #LSYNCD_OPTIONS="-pidfile /var/run/lsyncd.pid /etc/lsyncd.conf" #LSYNCD_OPTIONS=" " #LSYNCD_USER=""
次に amzn2。こちらも /etc/sysconfig/lsyncd
を読み込むようになっている。
# /usr/lib/systemd/system/lsyncd.service [Unit] Description=Live Syncing (Mirror) Daemon After=network.target [Service] Type=simple EnvironmentFile=-/etc/sysconfig/lsyncd ExecStart=/usr/bin/lsyncd -nodaemon $LSYNCD_OPTIONS [Install] WantedBy=multi-user.target
/etc/sysconfig/lsyncd
では lsyncd の設定ファイルだけが指定されている。
LSYNCD_OPTIONS="/etc/lsyncd.conf"
では /etc/sysconfig/lsyncd
の LSYNCD_OPTIONS
に -pidfile
を追加すれば PID ファイルが作成されるのかというと、これは作成されない。
どうも -nodaemon
で起動した場合は PID を生成しないらしい。ということで Issue にも上がっている。
lsyncd ignores -pidfile when -nodaemon is set · Issue #438 · axkibe/lsyncd · GitHub
monit に関しては PID ファイルが存在しないプロセス向けに matching
が使えるので下記のようにしておけば PID ファイルが存在しなくても監視してくれるようになる。
check process lsyncd matching "lsyncd" start program = "/usr/bin/systemctl start lsyncd" stop program = "/usr/bin/systemctl stop lsyncd"
常に動いていて欲しいだけなら monit を使わずとも systemd には自動再起動の設定があるので systemctl edit lsyncd
で /etc/systemd/system/lsyncd.service.d/override.conf
を作成して下記のように設定しておけば勝手に再起動する。
[Service] Restart=always