Monit重启程序脚本

时间:2014-11-23 15:06:38

标签: linux bash shell monit

我对monit相当新,我想知道这个脚本是否足以重新启动崩溃的程序让我们说program1是程序的名称。

check process program1
matching "program1"
start program = "/home/user/files/start.sh"
stop program = "/home/user/files/stop.sh"

它现在会重启崩溃的程序吗?我如何确保它在工作时不重启程序?

编辑: 更多信息 该程序使用端口30000 udp。这会让它更加谨慎吗? "周期"?

之间有多少秒
if failed port 30000 type UDP for 3 cycles then restart

3 个答案:

答案 0 :(得分:10)

  

Monit使用系统调用execv来执行程序或脚本。   这意味着您无法在开始时直接编写shell命令,   停止或执行声明。要做到这一点,你必须这样做;开始一个   shell并在那里发出命令。

Read about execution

这只是您应该执行程序或脚本的示例:

check process program1
matching "program1"
start program = "/bin/bash -c '/home/user/files/start.sh'"
stop program = "/bin/bash -c  '/home/user/files/stop.sh'"

基于ConfigurationExamples

答案 1 :(得分:2)

假设您有一个这样的脚本:

#!/usr/bin/python
import os, time
f = open('/tmp/myapp.pid', 'w')
f.write(str(os.getpid()))
f.close()
time.sleep(9)

创建一个monit.conf

set httpd port 2812 and allow monit:monit
set daemon 5
check process program with pidfile /tmp/myapp.pid
    start program = "/home/vagrant/myapp.py

然后使用以下命令运行monit:

monit -c monit.conf

现在Monit在后台运行并在程序死亡时重新运行

答案 2 :(得分:0)

我将启动一个简单的节点服务器,如果你杀了,monit会重新启动它,如果设置正确,你也会收到一封电子邮件。

位置/home/xxx/monitoring/nodejs

文件:node-server.js

var http = require('http');
var port = 8002;
var fs = require('fs');
var logStream = fs.createWriteStream(port+"_log.txt", {'flags':'a'});
var count = 0;
http.createServer(function(req, res){
    var output = (++count) + ' Request received in '+port+' @ ' + new Date()+'\n';
    console.log(output);
    logStream.write(output);
    res.writeHead(200, {'Content-Type' : 'text/plain'});
    res.end('From '+port+' @ ' + new Date());
}).listen(port);
console.log('Server running @ ' + port)

FILE:server.sh

#!/bin/bash

process=$1
PID_FILE="/home/xxx/monitoring/nodejs/file.pid"
case $process in
    start)
        echo "STARTING node js server in port 8002"
        nohup /usr/sbin/node /home/xxx/monitoring/nodejs/node-server.js > /home/xxx/monitoring/nodejs/server.log 2>&1 &
        echo $! > $PID_FILE
        ;;

    stop)
        kill -9 $(cat $PID_FILE)
        rm $PID_FILE
        ;;

    *)
        echo "INVALID OPTION"
        ;;
esac

位置:/ etc / monit / monitrc(对于ubuntu)

set mail-format {
   from: monit@TEST
   subject: monit alert -- XXX-PROD $EVENT $SERVICE
   message: $EVENT Service $SERVICE
                 Date:        $DATE
                 Action:      $ACTION
                 Host:        $HOST
                 Description: $DESCRIPTION

Your faithful employee,

 }
set mailserver smtp.gmail.com port 587 username "services.xxx@gmail.com" password "xxx" using tlsv1
set alert xxx@gmail.com


check process nodejs-server with pidfile  /home/xxx/monitoring/nodejs/file.pid
        start program = "/home/xxx/monitoring/nodejs/server.sh start"
        stop program = "/home/xxx/monitoring/nodejs/server.sh stop

服务器运行后,点击浏览器http://localhost:8002/。它会显示一些结果。现在通过从“监控状态”或任何其他方式查找其进程ID来终止进程。您将收到一封邮件,说明该流程不存在,但一段时间后,服务器将再次运行,您将收到一封邮件,说“再次启动流程”。

但是请记住,如果你从monit命令停止进程,如

monit stop nodejs-server

然后它将不会重新启动。你收到一封邮件说你的流程已经停止了。