0%

Centos7监控程序挂机自动重启

一、前言

  • 就是刚去公司,然后有个项目是每天都需要执行一些任务的
  • 然后听说之前旧版的项目有时会自动挂了,导致任务没执行
  • 然后我接手之后改版之后,暂时是没遇到挂了的情况。
  • 但是为了保险,打算在服务器写一个定时监控程序,如果挂了就给它重启

    虽然对自己代码也算自信,但是多重防护还是有必要的

二、Centos7设置定时任务

  • 在centos上最常用的定时任务应该就是crontab了,本文也是用它

1、检查是否安装了crontab

  • 运行命令:crontab -l
  • 如果显示no crontab for root 或者 显示当前的任务列表 或者 不报错 那说明已经安装

2、安装crontab

  • 如果发现没有安装,直接执行yum安装即可,如下
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
# 安装crontab
yum install -y cronie

# 常用的一些命令
# 启动服务
systemctl start crond
# 停止服务
systemctl stop crond
# 重启服务
systemctl restart crond
# 重载配置文件
systemctl reload crond
# 查看状态
systemctl status crond

# 设定某个用户的cron服务
crontab -u

# 显示crontab文件(显示已设置的定时任务)
crontab -l
# 编辑crontab文件(编辑定时任务)
crontab -e
# 删除crontab文件(删除定时任务)
crontab -r
# 删除crontab文件提醒用户(删除定时任务)
crontab -i

3、设置定时任务

  • 设置定时有几种方式
①、直接编辑配置文件
  • 配置文件路径:/etc/crontab
  • 直接添加到最后一行即可
  • 因为在crontab中,%是代表着换行,所以需要转义
  • 如:* * * * * root echo \"test-$(date '+\%Y\%m\%d\%H\%M\%S') info\" >> /root/cron.log

②、使用crontab -e命令编辑
  • 使用命令编辑相当于就是编辑当前用户的任务,所以不需要加用户字段
  • 如:* * * * * echo \"test-$(date '+\%Y\%m\%d\%H\%M\%S') info\" >> /root/cron.log
  • 这里其实会写入到:/var/spool/cron/ 目录下以当前用户名字命名的文件
  • 如,如果是root用户,那么就是:/var/spool/cron/root这个文件

三、定时监控程序

  • 知道怎么设置定时任务,那接下来就是写脚本查看程序是否运行了

1、编写脚本

  • 我这边是查看Java进程,思路是一样的,就是通过命令查看程序是否在运行
  • 为了方便,我把程序的 关闭、启动、监控、日志 等全放一个脚本里面了。
  • 如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
#!/bin/bash

source /etc/profile

# 脚本当前目录
CUR_PATH=$( cd ${0%/*} && pwd )
LOG=$CUR_PATH/logs
BACKUP=$CUR_PATH/backup
cd $CUR_PATH
# 查看目录下的jar包
JAR=$(find . -maxdepth 1 -name "*.jar")
JAR_NAME="${JAR:2}"
# JAR_NAME=met-machining-process.jar
JARNAME=${JAR_NAME%.*}
JARNAME_TYPE=${JAR_NAME##*.}

# 得到程序执行的进程PID号
JAR_PID=`ps -ef | grep $JAR_NAME |grep -v color |grep -v grep | awk '{print $2}'`
CRON_LOG=$LOG/$(date "+%Y-%m-%d")_cron.log

check()
{
if [[ ! -d "$LOG" ]]
then
mkdir -p $LOG
fi

if [[ ! -d "$BACKUP" ]]
then
mkdir -p $BACKUP
fi

}

# 监控进程执行的
monitor()
{
DATE_STR=`date "+%Y-%m-%d_%H:%M:%S"`
if [[ $JAR_PID != "" ]]
then
echo "$DATE_STR $JAR_NAME 进程ID pid: $JAR_PID 正在运行" >> $CRON_LOG
else
echo "$DATE_STR $JAR_NAME 未启动,尝试启动 " >> $CRON_LOG
start
fi
}

backup()
{
cd $CUR_PATH

if [ -f "$JAR_NAME" ];then
sudo cp $JAR_NAME $BACKUP/$JARNAME-$(date "+%Y%m%d-%H%M%S").$JARNAME_TYPE
sleep 2s
fi

}

stop()
{

if [[ $JAR_PID != "" ]]
then
echo "$JAR_NAME 进程ID pid: $JAR_PID"
echo "stop..."
kill -9 $JAR_PID
echo "已停止$JAR_NAME"
else
echo "$JAR_NAME 未启动"
fi
}

start()
{
JAR_PID=`ps -ef | grep $JAR_NAME |grep -v color |grep -v grep | awk '{print $2}'`
if [ ! -z "$JAR_PID" ]
then
echo "$JAR_NAME 正在运行,进程ID:$JAR_PID"
exit 0
fi
echo "" > /$LOG/out.log
nohup java -jar -Dspring.profiles.active=test $JAR_NAME >$LOG/out.log 2>&1 &
echo "$JAR_NAME 启动成功"
}

status()
{
if [ ! -z "$JAR_PID" ]
then
echo "$JAR_NAME 正在运行,进程ID:$JAR_PID"
else
echo "$JAR_NAME 未在运行"
fi
}

logger()
{
tail -200f $LOG/out.log
}

monitorlog()
{
tail -200f $CRON_LOG
}


check

case $1 in
start)
start
;;
stop)
stop
;;
restart)
stop
start
;;
status)
status
;;
log)
logger
;;
backup)
backup
;;
monitor | m)
monitor
;;
monitorlog | mlog)
monitorlog
;;
*)
echo "命令错误,可选:$0 {stop|start|restart|status|log}"

;;
esac
  • 如上,脚本中的 monitor 方法就是监控程序执行的
  • 我是把监控的信息,打印到了 cron.log日志文件中
②、设置定时任务
  • 执行命令:crontab -e 添加内容:*/1 * * * * /home/met/server.sh monitor
  • 然后就结束了,执行结果如下:

您的打赏,是我创作的动力!不给钱?那我只能靠想象力充饥了。