Linux Shell 脚本判断进程是否存在

最近接到一个非【iOS】的活儿(生无可恋的表情)。。。是的,每个人都是萝卜,哪里有【坑】去哪里!!
...话接前言,这个活儿就是写一个程序在云服务器上做某个软件的性能测试,什么语言都行(最后选了c++编写,我都不知道为什么。。。),让程序一直跑,所以这个【一直跑】就是今天要说的,一直跑就是让程序在未知原因退出时重新启动。


【运行环境Centos 7.3】

1.进程守护

进程守护就是编写一个脚本,检测程序进程是否存在,如果不存在就启动程序。
想法就是判断某个进程的个数是否为‘0’,这个菜鸡的我遇到了一个坑:就是在程序未启动的情况下统计进程的数竟然不为‘0’,为‘2’,‘3’的情况都有。。。先给个脚本模板(看到代码是不是很开心。。。):

重要提示:所有路径必须是绝对路径!!!包括定时任务!

count=^ps -ef | grep xxx_app | grep -v "grep" | grep -v "xxx_daemon.sh" | wc -l^
if [ 0 -eq $count ]
then
-->启动你的程序,your code here
else
--> 程序正在运行 ...
fi

说明:
【 ^ 】:方括号中的符号要换成【 ` 】就是esc键下面的那个键的英文模式按键,markdown语法问题。。。
count:变量,接收包括进程名为‘xxx_app’的统计行数
xxx_app:程序名,进程名
xxx_daemon.sh:进程守护脚本文件

填坑的两句话:「1」【grep -v "grep"】 和 「2」【grep -v "xxx_daemon.sh"】,意思是显示不包括匹配到的关键字的行,因为ps -ef命令打印所有进程,通过grep正则匹配到含有“xxx_app”关键字的进程,这个会匹配到该命令本身所在行,即grep xxx_app,所以用「1」不显示该行,而「2」则是在将脚本添加至定时任务时需要过滤的,因为脚本的文件名或者脚本文件内容中的某些字符串可能包括xxx_app关键字。

2. 定时任务

写完脚本下一步需要将脚本添加到定时任务中,让脚本周期性地运行,所以前提是要确保机器上安装了【cron】,因为稍后我们将使用【crontab】命令~

借用【/etc/crontab】文件中的内容说一下定时任务的设置规则:
Example of job definition:
.---------------- minute (0 - 59)
| .------------- hour (0 - 23)
| | .---------- day of month (1 - 31)
| | | .------- month (1 - 12) OR jan,feb,mar,apr ...
| | | | .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
| | | | |
* * * * * user-name command to be executed
关心【*】的含义就行,后面先不用管
五个*由左至右分别为:【分钟】、【小时】、【日】、【月】、【星期】,用来设置执行周期

注:感兴趣的朋友可以搜一下【crontab -e】和【vim /etc/crontab】的设置定时任务的区别

设置定时任务

进入定时任务编辑页面:
命令行输入:crontab -e,默认为当前登录用户配置crontab,你也可以指定一个用户:crontab -u xxx -e
最后一行添加:
【*/1 * * * * /bin/sh /aa/bb/xxx_daemon.sh】

含义:每分钟执行一次脚本,如果没有斜杠【 / 】则表示每个小时的第一分钟,e.g.:1 * * * * /bin/sh /aa/bb/xxx_daemon.sh

【 * 】:匹配所有可能的值
【 , 】:或的关系,1,5 * * * *,每个小时的1分钟或5分钟
【 - 】:一个范围,1-5 * * * *,每个小时的1分钟到5分钟,5个时间点
【 / 】:间隔频率,*/1 * * * *,每隔1分钟

在线crontab任务工具

3. 最后的啰嗦

crontab -l,查看当前用户定时任务列表
crontab -r,删除当前用户的crontab文件

可以指定某个用户 crontab -u xx option

安装crontab
yum install vixie-cron,cron主程序
yum install crontabs,cron程序的外壳,用来驱动cron

启动服务
systemctl start crond

停止服务
systemctl stop crond

重新加载服务
systemctl reload crond

重启服务
systemctl restart crond

查看服务运行状态
systemctl status crond

设置开机启动
systemctl enable crond

查看是否开机启动
systemctl list-unit-files | grep crond

你可能感兴趣的:(Linux Shell 脚本判断进程是否存在)