前言

我们在Linux系统启动应用服务成功后需要做一下运维监控工作,比如应用因某些不可控原因服务挂了,或者断电机器后重启了,我们发服务进程就消失了,如果人不在电脑旁边就无法快速响应服务拉起工作。

这时候我们需要一个机器层面的任务调度,自动把不在服务的应用自动拉起。

定时任务

crontab

Linux系统中有一个定时任务配置,我们可以利用这个工具帮我们做这类操作,一般操作系统已经安装了的,如果没有安装的网上找一下安装方式,这类就不着重说安装了。我们着重看如何使用。

# 执行命令
crontab -e
# 会打开一个vi编辑界面,这里要注意的是你现在登录的用户是什么用户。
# crontab执行的用户是分开的,所以一定要注意
# 这里我用的root登录linux的,所以执行这个命令的时候是打开root用户的调度器

cron表达含义如下:

其中 f1 是表示分钟,f2 表示小时,f3 表示一个月份中的第几日,f4 表示月份,f5 表示一个星期中的第几天。program 表示要执行的程序。
当 f1 为 * 时表示每分钟都要执行 program,f2 为 * 时表示每小时都要执行程序,其馀类推
当 f1 为 a-b 时表示从第 a 分钟到第 b 分钟这段时间内要执行,f2 为 a-b 时表示从第 a 到第 b 小时都要执行,其馀类推
当 f1 为 */n 时表示每 n 分钟个时间间隔执行一次,f2 为 */n 表示每 n 小时个时间间隔执行一次,其馀类推
当 f1 为 a, b, c,... 时表示第 a, b, c,... 分钟要执行,f2 为 a, b, c,... 时表示第 a, b, c...个小时要执行,其馀类推

*    *    *    *    *
-    -    -    -    -
|    |    |    |    |
|    |    |    |    +----- 星期中星期几 (0 - 6) (星期天 为0)
|    |    |    +---------- 月份 (1 - 12) 
|    |    +--------------- 一个月中的第几天 (1 - 31)
|    +-------------------- 小时 (0 - 23)
+------------------------- 分钟 (0 - 59)

假如我们在/home/下有一个test.sh执行文件,需要一分钟执行一次,那可以这么在里面加定时任务语句

# 执行crontab -e 其实就是打开这个文件进行编辑的 /var/spool/cron/root
... 省略 ...
* * * * * /home/test.sh

执行结果请到这个目录下查看

# 日志路径
tail -f /var/log/cron
# 这个是指(root)执行脚本的用户
Aug 24 19:18:01 VM-0-17-centos CROND[19146]: (root) CMD (flock -xn /tmp/stargate.lock -c '/usr/local/qcloud/stargate/admin/start.sh > /dev/null 2>&1 &')
Aug 24 19:18:01 VM-0-17-centos CROND[19145]: (root) CMD (bash /home/jekyll/cookiejoo/jekyll_monitor.sh)
Aug 24 19:19:01 VM-0-17-centos CROND[20233]: (root) CMD (bash /home/jekyll/cookiejoo/jekyll_monitor.sh)
Aug 24 19:19:01 VM-0-17-centos CROND[20234]: (root) CMD (flock -xn /tmp/stargate.lock -c '/usr/local/qcloud/stargate/admin/start.sh > /dev/null 2>&1 &')
Aug 24 19:20:01 VM-0-17-centos CROND[20551]: (root) CMD (flock -xn /tmp/stargate.lock -c '/usr/local/qcloud/stargate/admin/start.sh > /dev/null 2>&1 &')
Aug 24 19:20:01 VM-0-17-centos CROND[20555]: (root) CMD (flock -xn /tmp/stargate.lock -c '/usr/local/qcloud/stargate/admin/start.sh > /dev/null 2>&1 &')
Aug 24 19:20:01 VM-0-17-centos CROND[20565]: (root) CMD (/usr/local/qcloud/YunJing/clearRules.sh > /dev/null 2>&1)
Aug 24 19:20:01 VM-0-17-centos CROND[20566]: (root) CMD (bash /home/jekyll/cookiejoo/jekyll_monitor.sh)
Aug 24 19:21:01 VM-0-17-centos CROND[20889]: (root) CMD (bash /home/jekyll/cookiejoo/jekyll_monitor.sh)
Aug 24 19:21:01 VM-0-17-centos CROND[20897]: (root) CMD (flock -xn /tmp/stargate.lock -c '/usr/local/qcloud/stargate/admin/start.sh > /dev/null 2>&1 &')

实际应用

我们以博客启动为例,我用静态markdown脚本生成工具jekyll,但是总会莫名其妙的挂,我在gitee.io上面就没这种情况,自己在腾讯云上部署就出现,所以我就用这种方式解决自启动问题。

用curl去检测网站是否已经启动返回200状态,如果启动就跳过,如果没有启动就执行启动命令。

#!/bin/sh
# 这一句很重要,一定要有刷新环境变量的声明,否则下面执行的命令可能就报错没有权限
# 比如java -jar 和 ruby一些命令,这个问题我搞了好几个小时才测通过。
# 注意:不同版本的OS版本source 路径不一样,大家要看清楚刷新环境变量的功能
source /etc/profile
status=$(curl -s -m 5 -IL http://localhost:80/|grep 200)
# 如果服务没有开启,sever 0
# 如果服务没有开启,开启;若服务已经开启,输出提示
if [ "$status" == "" ]; then 
  sudo su root
  cd /home/xxx/
  nohup **脚本**  > 日志路径 2>&1 &
  printf "时间:$(date +"%Y-%m-%d %H:%M:%S") 执行启动命令\n" >> /home/jekyll/port_scan.log
else
  printf "时间:$(date +"%Y-%m-%d %H:%M:%S") jekyll is running!!\n" >> /home/jekyll/port_scan.log
fi

最后,完毕。

我以后再也不用担心我的博客莫名其妙的挂,自己又不在电脑旁边了。