mattintosh note

どこかのエンジニアモドキの備忘録

monitでlsyncdをモニタリングしたいけどpidfileが作成されない

Amazon Linux 2 で monit で何らかのプロセスを監視させるとき、そのプロセスの PID ファイルを指定する(PID ファイルじゃなくても出来るのだが)。

Amazon Linux 1(以下 amzn1)では lsyncd 使ってるときに /var/run/lsyncd.pid が作成されてた気がするんだけど Amazon Linux 2(以下 amzn2)にしてから /etc/lsyncd.confpidfile = を指定しても作成されなかったのでちょっと確認することにした。

まずはそれぞれの実行状態。

amzn1

$ ps w -C lsyncd
  PID TTY      STAT   TIME COMMAND
20806 ?        Ss     0:00 /usr/bin/lsyncd -pidfile /var/run/lsyncd.pid /etc/lsyncd.conf

amzn2

$ 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 から。

amzn1: /etc/init.d/lsyncd

  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 も用意されているがすべてコメントアウトされている。

amzn1: /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 を読み込むようになっている。

amzn2: systemctl cat 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 の設定ファイルだけが指定されている。

amzn2: /etc/sysconfig/lsyncd

LSYNCD_OPTIONS="/etc/lsyncd.conf"

では /etc/sysconfig/lsyncdLSYNCD_OPTIONS-pidfile を追加すれば PID ファイルが作成されるのかというと、これは作成されない

どうも -nodaemon で起動した場合は PID を生成しないらしい。ということで Issue にも上がっている。

lsyncd ignores -pidfile when -nodaemon is set · Issue #438 · axkibe/lsyncd · GitHub

monit に関しては PID ファイルが存在しないプロセス向けに matching が使えるので下記のようにしておけば PID ファイルが存在しなくても監視してくれるようになる。

amzn2: /etc/monit.d/lsyncd

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 を作成して下記のように設定しておけば勝手に再起動する。

amzn2: /etc/systemd/system/lsyncd.service.d/override.conf

[Service]
Restart=always