我已经在我的 Deabian 服务器上安装了 monit,配置如下:
set logfile /var/log/monit.log
check process myprogram with pidfile /var/run/myprogram.pid
start program = "/etc/init.d/myprogram start"
stop program = "/etc/init.d/myprogram stop
发出后:/etc/init.d/monit start
服务启动并myprogram
正常启动。
如果我手动终止我的程序,我期望 monit 会自动重新启动它,但发现 monit 迷失了方向。它不仅不会重新启动进程,而且 monit 进程已完成,无法重新启动(/etc/init.d/monit
start 说 OK,但进程没有出现。日志文件中没有数据)。
如果我删除,我只能重新启动所有内容/var/run/myprogram.pid
,所以我有以下问题:
a) monit 检查进程的默认间隔是多少?b) monit 会依赖吗/var/run/myprogram.pid
?我不确定崩溃时这个文件是否会被删除....c) 为什么终止进程并没有强制 monit 重新启动?
请告知我可能做错了什么...
我的程序 init.d 脚本/etc/init.d/myprogram
:
#!/bin/bash
#
# Program parameters
#
NAME=myprogram
DIR=/usr/local/bin/myprogram/bin
AEIRTU_HOME=/usr/local/bin/myprogram
#
# Internal variables
#
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
EXEC=$DIR/$NAME
PIDFILE=/var/run/$NAME.pid
if ! [[ -x "$EXEC" ]]
then
echo "File '$EXEC' is not executable or not found. Aborting."
fi
function start_app {
echo "Starting $NAME...";
cd $DIR
AEIRTU_HOME=$AEIRTU_HOME nohup "$EXEC" 1>>"/var/log/$NAME.log" 2>&1 &
echo $! > "/var/run/$NAME.pid"
echo "$NAME started ok";
}
function stop_app {
echo "Stopping $NAME...";
if [[ -e "$PIDFILE" ]]
then
kill `cat /var/run/$NAME.pid`
echo "$NAME stopped."
else
echo "Cannot stop $NAME...";
fi
}
case $1 in
start)
start_app ;;
stop)
stop_app ;;
restart)
stop_app
sleep 5
start_app
;;
*)
echo "usage: myprogram {start|stop|restart}" ;;
esac
exit 0
答案1
a) monit 检查进程的默认间隔是多少?这可以定义为:
- 使用以下方式全局设置设置守护进程<秒数>
- 在规则级别设置
- 每 [数字] 个周期
- 每个 [cron]
- 并非每个 [cron]
b) monit 是否依赖 /var/run/myprogram.pid?Monit 将检查是否有程序正在使用文件中包含的 pid 号运行。如果不存在具有此 pid 的程序,则 Monit 将在 Monit 唤醒时按照规则中定义的操作。
c) 为什么终止进程没有强制 monit 重新启动?可能是由于设置守护进程太重要了。当 Monit 唤醒每个设置守护进程间隔,它会寻找需要验证的规则。