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.
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.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With