monit removes quotes from start program commands
Asked Answered
M

2

6

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.

Mockery answered 30/7, 2013 at 9:35 Comment(0)
W
2

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.

Wilhite answered 30/1, 2015 at 10:44 Comment(0)
L
0

Put the commands regarding the "start program" and "stop program" into a shell script, make it executable and then give its address to monit.

also, try to escape it single quote using slash

\'

(i haven't tried so i don't know if it works).

Lowman answered 30/7, 2013 at 16:9 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.