我正在调试monit启动/停止程序语句。在我的/etc/monit.conf
文件中,我的start program
语句如下所示:
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'""
我在shell中用
进行了测试$ 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 '
运行此命令会在/tmp/monit.out
文件中返回正确的输出:
Starting nodejs daemon...
nodejs daemon started. PID: 16408
但是当我运行sudo monit -v monitor node
时,它会显示不同的命令,除了内部单引号已删除之外:
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
我在monit文档中找不到任何相关内容。文档here似乎是最终的参考,但没有通过源代码,我不知道下一步该做什么。
我的命令在没有删除引号的情况下完美运行,所以我只需要解决这个问题。欢迎所有想法和可能的修复。
答案 0 :(得分:2)
这是一个相当晚的答案,但我发现它很重要,因为它会引起一些误解(所以我被误导了)
您无需转义单引号字符。试试吧:
check process fake_proc
with pidfile /tmp/test_pid
start = "/bin/bash -c 'echo $$ > /tmp/test_pid'"
stop = "echo stop > /tmp/test_pid"
它不会显示为已启动的进程,但会创建test_pid
文件。添加; sleep xx
以捕获进程并检查其属性。
问题可能是由某个特定环境问题引起的。
答案 1 :(得分:0)
将关于“启动程序”和“停止程序”的命令放入shell脚本中,使其可执行,然后将其地址提供给monit。
另外,尝试使用斜杠
来逃避单引号\'
(我没试过,所以我不知道它是否有效。)