Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

monit removes quotes from start program commands

I am debugging monit start/stop program statements. In my /etc/monit.conf file, my start program statement looks like this:

check process node with pidfile /home/ec2-user/blah/node.pid
    start program = "/bin/su -c 'export APP_ENV=development; /home/ec2-user/local/bin/node /home/ec2-user/example.com/current/api.js start &> /tmp/monit.out ' "
    stop program = "/bin/su -c '/home/ec2-user/local/bin/node /home/ec2-user/example.com/current/api.js stop'""

which I've tested in a shell with

$ sudo su
# env -i PATH=/bin:/usr/bin:/sbin:/usr/sbin /bin/sh
# /bin/su -c '/usr/bin/env APP_ENV=development; /home/ec2-user/local/bin/node /home/ec2-user/example.com/current/api.js start &> /tmp/monit.out '

running this returns in the /tmp/monit.out file the correct output:

Starting nodejs daemon...
nodejs daemon started. PID: 16408

But when I run sudo monit -v monitor node, it displays a different command, identical except with the inner single quotes removed:

The service list contains the following entries:

Process Name          = node
 Pid file             = /home/ec2-user/blah/node.pid
 Monitoring mode      = active
 Start program        = '/bin/su -c export APP_ENV=development; /home/ec2-user/local/bin/node /home/ec2-user/example.com/current/api.js start &> /tmp/monit.out ' timeout 30 second(s)
 Stop program         = '/bin/su -c /home/ec2-user/local/bin/node /home/ec2-user/example.com/current/api.js stop' timeout 30 second(s)
 Existence            = if does not exist 1 times within 1 cycle(s) then restart else if succeeded 1 times within 1 cycle(s) then alert
 Pid                  = if changed 1 times within 1 cycle(s) then alert
 Ppid                 = if changed 1 times within 1 cycle(s) then alert

System Name           = system_ip-xx-xx-xx-xx.ec2.internal
 Monitoring mode      = active

I can't find anything about this in the monit documentation. The documentation here seems to be the ultimate reference but short of going through the source code, I'm not sure what to do next.

My command works perfectly without the quotes removed, so I just need to fix this issue. All ideas and possible fixes welcome.

like image 710
dubeegee Avatar asked Jul 30 '13 09:07

dubeegee


1 Answers

It's a quite late answer, nevertheless I find it important since it causes some misunderstanding (so I was misleaded)

You don't need to escape a single quote character. Try it:

check process fake_proc
  with pidfile /tmp/test_pid
  start = "/bin/bash -c 'echo $$ > /tmp/test_pid'"
  stop = "echo stop > /tmp/test_pid"

It will not shown as a started process, however test_pid file is created. Add ; sleep xx to catch a process and examine its properties.

The problem might be caused by a some env-specific issue.

like image 60
Vladimir Chervanev Avatar answered Oct 11 '22 15:10

Vladimir Chervanev