首页 > 经验记录 > 操作系统 > 我写的一个监控java进程的shell脚本结合Linux crontab实现服务宕机重启,并实现按场景自动停止定时任务的功能

我写的一个监控java进程的shell脚本结合Linux crontab实现服务宕机重启,并实现按场景自动停止定时任务的功能

本来遇到了很奇怪的坑,crontab定时任务执行的shell脚本和自己手动执行的shell脚本不一致。

在java进程已启动的情况下, crontab定时任务执行的脚本却总是找不到对应的pid。

试了好几种解决方法,结果还是不行。

全部命令都用绝对路径执行啊,环境导入啊之类的,都试了下,没有作用,后来自己用crontab里写的定时任务试了试,出现了很多很奇怪的东西

后来还是在 grep “进程名”  之前加了个grep java  才解决的

 

crontab的定时任务如下: 

 

 

shell脚本如下:

 

都写了注释,应该可以说是很清晰了。

核心逻辑就是查询指定的进程id,若是有则无事发生,若是没有 则执行另一个启动脚本将服务启动。期间伴随日志打印到特定文件中。

 

定时任务则是每十分钟启动一次,这个cron表达式在SpringBoot的定时任务里也有实现,就不说了。

这样子定时任务运行起来其实是没有问题的,但是还不能满足需求。

 

试想这么一个场景:

刚刚关闭掉这个服务器,还在上传文件/部署/设置参数 的过程中,此时时间刚好到那个定时任务启动的时间了,他这定时任务又给你把服务给启动起来了,那岂不是很尴尬。

而且定时任务又不是想停就停,linux的定时任务要停只能执行 crontab -e 然后手动修改文件才可以。

 

这个时候我灵光一闪,既然定时任务停不了,那我让你执行命令无法成功不就完事了

于是我在启动服务的脚本和关闭服务的脚本中加入了如下代码:

 

在我手动关闭服务器时,关闭脚本会将定时任务试图执行的moniter.sh 文件名字给改了,这时候定时任务无法找到对应脚本则无法执行相应命令。

然后在我手动启动时,再给他改回去,让定时任务可以找到对应脚本。

 

最终实现效果果然如我所料一般完美,要是服务宕机,自然不是我手动关闭的,那么由于文件名没有被修改掉所以定时任务可以定时执行检测脚本,之后服务就会被重启。

那在维护时我手动进行的服务停止则会带动定时任务的停止,不用担心他自个偷偷摸摸的启动了。

整体实现效果非常满意。

 


EA PLAYER &

历史记录 [ 注意:部分数据仅限于当前浏览器 ]清空

      00:00/00:00