一、前言
- 就是刚去公司,然后有个项目是每天都需要执行一些任务的
- 然后听说之前旧版的项目有时会自动挂了,导致任务没执行
- 然后我接手之后改版之后,暂时是没遇到挂了的情况。
- 但是为了保险,打算在服务器写一个定时监控程序,如果挂了就给它重启
虽然对自己代码也算自信,但是多重防护还是有必要的
二、Centos7设置定时任务
- 在centos上最常用的定时任务应该就是crontab了,本文也是用它
1、检查是否安装了crontab
- 运行命令:
crontab -l
- 如果显示
no crontab for root
或者 显示当前的任务列表 或者 不报错 那说明已经安装
2、安装crontab
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
| yum install -y cronie
systemctl start crond
systemctl stop crond
systemctl restart crond
systemctl reload crond
systemctl status crond
crontab -u
crontab -l
crontab -e
crontab -r
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=$(find . -maxdepth 1 -name "*.jar") JAR_NAME="${JAR:2}"
JARNAME=${JAR_NAME%.*} JARNAME_TYPE=${JAR_NAME##*.}
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
- 然后就结束了,执行结果如下:
您的打赏,是我创作的动力!不给钱?那我只能靠想象力充饥了。
微信支付
支付宝