2014-11-23 196 views
6

我對monit相當陌生,我想知道這個腳本是否足以重啓一個崩潰的程序,讓我們說program1是程序的名稱。Monit重啓程序腳本

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 

回答

7

monit的使用系統調用execv執行一個程序或腳本。 這意味着您不能直接在開始, stop或exec語句中編寫shell命令。要做到這一點,你必須按照上面的方法去做;啓動一個 shell並在那裏發佈你的命令。

Read about execution

這是你應該執行的程序或腳本只是例子:基於ConfigurationExamples

+0

它說:'程序1'進程沒有運行。試圖重新啓動。開始:/ bin/bash。無法啓動 – Zero 2014-11-23 18:30:18

+1

請閱讀文檔,我不知道你做錯了什麼。你處理真正命名的「program1」? – 2014-11-23 19:48:28

+0

,你應該開始處理,在monit可以與他合作之前。 – 2014-11-23 19:52:21

1

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'" 

假設你有一個這樣的腳本:

#!/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的在後臺運行,並重新運行的過程中如果死了

0

我將開始一個簡單的節點服務器,如果你殺了,monit會重新啓動它,如果設置正確,你也會收到一封電子郵件。

位置/home/xxx/monitoring/nodejs

文件:節點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 

LOCATION:在/ etc/monit的/ monitrc(爲Ubuntu)

set mail-format { 
    from: [email protected] 
    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 "[email protected]" password "xxx" using tlsv1 
set alert [email protected] 


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/。它會顯示一些結果。現在通過從'monit status'或其他方式找到它的進程id來終止進程。你會收到一封郵件,說這個過程不存在,但過了一段時間後,服務器會運行,你會收到一封郵件說'過程重新開始'。

但請記住,如果你從monit的命令停止過程就像

monit stop nodejs-server 

然後它不會重新啓動。你會收到一封郵件,說你的流程已經停止。