A short time after I installed Monit, I tried to monitor a background running process that does not support daemon mode.
It is an exceptionally rare situation, but very interesting one, so after a while a came with a quite simple solution using additional shell script.

Shell script

This is a shell script used to start/stop service. It will execute /opt/service/service command in the background and manage PID file.

$ cat /usr/sbin/service.sh
#!/bin/sh
# start/stop service and create pid file for a non-daemon app
# service command
service_cmd="/opt/service/service"
# pid file location
service_pid="/var/run/service.pid"
if [ $# -eq 1 -a  "$1" = "start" ]; then
  if [ -f "$service_pid" ]; then
    kill -0 $(cat $service_pid) 2>/dev/null # check pid
    if [ $? -eq 0 ]; then
      exit 2; # process is running, exit
    else
      unlink $service_pid # process is not running
                          # remove stale pid file
    fi
  fi
  # start service in background and store process pid
  $service_cmd >/dev/null &
  echo $! > $service_pid
elif  [ $# -eq 1 -a "$1" = "stop" -a -f "$service_pid" ]; then
  kill -0 $(cat $service_pid) 2>/dev/null # check pid
  if [ $? -eq 0 ]; then
    kill $(cat $service_pid) # kill process if it is running
  fi
  unlink $service_pid
fi

This shell script is quite simple, but there are several commands that are worth your attention. I described them in two earlier blog posts: How to get PID of the background process, How to check whether the process ID still exists.

Monit configuration

Use defined PID file and code listed in the previous section to manage service using Monit.

# cat /etc/monit/conf.d/service.conf
check process service with pidfile /var/run/service.pid
  start program = "/usr/sbin/service.sh start"
  stop  program = "/usr/sbin/service.sh stop"
  depend on service_bin
  check file service_bin with path /usr/sbin/service.sh
    if failed checksum       then unmonitor
    if failed permission 755 then unmonitor
    if failed uid root       then unmonitor
    if failed gid root       then unmonitor

Sample summary information.

$ sudo monit summary
The Monit daemon 5.4 uptime: 16h 22m
Process 'service'                   Running
File 'service_bin'                  Accessible

Sample status information.

$ sudo monit status
The Monit daemon 5.4 uptime: 16h 22m
Process 'service'
  status                            Running
  monitoring status                 Monitored
  pid                               1883
  parent pid                        1
  uptime                            16h 19m
  children                          0
  memory kilobytes                  1900
  memory kilobytes total            1900
  memory percent                    0.1%
  memory percent total              0.1%
  cpu percent                       0.0%
  cpu percent total                 0.0%
  data collected                    Tue, 30 Sep 2014 18:35:40
File 'service_bin'
  status                            Accessible
  monitoring status                 Monitored
  permission                        755
  uid                               0
  gid                               0
  timestamp                         Tue, 30 Sep 2014 18:35:40
  size                              1306006 B
  checksum                          bc9b654871c608bee03bf8a781c14818 (MD5)
  data collected                    Tue, 30 Sep 2014 18:35:40
ko-fi