2013-05-13 120 views
2

我写了一个可以正常启动和停止服务器的脚本。Monit无法启动进程

#!/bin/bash 

PID_FILE='/var/run/rserve.pid' 

start() { 
     touch $PID_FILE 
     eval "/usr/bin/R CMD Rserve" 
     PID=$(ps aux | grep Rserve | grep -v grep | awk '{print $2}') 
     echo "Starting Rserve with PID $PID" 
     echo $PID > $PID_FILE 
} 
stop() { 
     pkill Rserve 
     rm $PID_FILE 
     echo "Stopping Rserve" 
} 

case $1 in 
    start) 
     start 
     ;; 
    stop) 
     stop 
     ;; 
    *) 
     echo "usage: rserve {start|stop}" ;; 
esac 
exit 0 

如果我启动它运行

rserve start 

,然后开始monit它将正确捕捉PID和服务器:

The Monit daemon 5.3.2 uptime: 0m 

Remote Host 'localhost' 
    status       Online with all services 
    monitoring status     Monitored 
    port response time    0.000s to localhost:6311 [DEFAULT via TCP] 
    data collected     Mon, 13 May 2013 20:03:50 

System 'system_gauss' 
    status       Running 
    monitoring status     Monitored 
    load average      [0.37] [0.29] [0.25] 
    cpu        0.0%us 0.2%sy 0.0%wa 
    memory usage      524044 kB [25.6%] 
    swap usage      4848 kB [0.1%] 
    data collected     Mon, 13 May 2013 20:03:50 

如果我停止它,它会正常杀死该过程并取消监视它。但是,如果我再次启动它,它不会再次启动服务器:

ps ax | grep Rserve | grep -vc grep 
1 
monit stop localhost 
ps ax | grep Rserve | grep -vc grep 
0 
monit start localhost 

[UTC May 13 20:07:24] info  : 'localhost' start on user request 
[UTC May 13 20:07:24] info  : monit daemon at 4370 awakened 
[UTC May 13 20:07:24] info  : Awakened by User defined signal 1 
[UTC May 13 20:07:24] info  : 'localhost' start: /usr/bin/rserve 
[UTC May 13 20:07:24] info  : 'localhost' start action done 
[UTC May 13 20:07:34] error : 'localhost' failed, cannot open a connection to INET[localhost:6311] via TCP 

这里是monitrc:

check host localhost with address 127.0.0.1 
    start = "/usr/bin/rserve start" 
    stop = "/usr/bin/rserve stop" 
    if failed host localhost port 6311 type tcp with timeout 15 seconds for 5 cycles 
    then restart 
+0

难道你的程序需要10秒以上才能启动? – Wrikken 2013-05-13 20:13:28

+0

我也试过超时30,启动时间不到5秒。即使我将原始命令“R CMD Rserve”与monitrc中的“\ bin \ bash -c”一起使用,它也不起作用。它似乎无法从monit守护进程启动它。 – 2013-05-13 20:25:25

+0

你有没有想过这个?我有类似的问题。 – StFS 2013-10-11 11:50:27

回答

6

我有问题开始或通过壳停止过程了。 一种解决方案可能会在这样的配置可以添加“/斌/庆典”:

start program = "/bin/bash /urs/bin/rserv start" 
stop program = "/bin/bash /urs/bin/rserv stop" 

它为我工作。

+0

顺便说一句,我从这个http://lists.gnu.org/archive/html/monit-general/2008-12/msg00004.html – 2013-10-25 08:27:11

+0

得到的信息也看到这个http:///lists.gnu.org/archive/html/monit-general/2010-01/msg00035。html – 2013-10-25 08:29:08

+3

此解决方案在monit的FAQ中更详细地描述了为什么它需要以及如何使用它http://mmonit.com/wiki/Monit/FAQ#execution – LeoR 2014-03-20 13:56:58

3

monit是一个沉默的杀手。它没有告诉你任何事情。这里是我会检查哪些监视不会帮助您识别的东西

  1. 检查您正在读/写的所有文件的权限。如果要重定向输出到文件,确保文件是UID写入和gid您使用的是执行程序
  2. 再次检查该程序的exec允许你尝试运行
  3. 指定任何程序的完整路径你正在尝试执行(不是绝对必要的,但是如果你总是指定完整路径,你不必担心路径没有被设置)
  4. 确保你可以在没有任何错误的情况下运行monit之外的程序,然后尝试调查monit为什么没有开始。
0

monit的时候就开始检查自己的和了pidfile检查是否有 匹配PID的进程已经在运行 - 如果确实如此,那么它只是唤醒这 过程。

你的情况

,检查这个PID正被其他进程: PS英法| grep的4370

如果是,那么你需要删除以下文件(通常在/运行目录)和再次启动监视: monit.pid