在shell中,判断一个进程是否存在,是判断进程数量
1:进程判断
没有运行进程时,如下显示,只有一条,这条就是这条命令的进程。
ubuntu@k8s-node1:~$ ps -ef|grep nginx
ubuntu 7922 4021 3 09:05 pts/0 00:00:00 grep --color=auto nginx
如果进程存在就会显示多条进程信息,其中一条包括命令这条。
ubuntu@k8s-node1:~$ ps -ef|grep nginx
1997 2954 1983 0 08:59 ? 00:00:00 nginx: master process /usr/sbin/nginx -g daemon off;error_log /dev/stdout info; -c /etc/nginx/nginx.conf
1997 2956 2954 0 08:59 ? 00:00:00 nginx: worker process
1997 2957 2954 0 08:59 ? 00:00:00 nginx: worker process
1997 2958 2954 0 08:59 ? 00:00:00 nginx: worker process
1997 2959 2954 0 08:59 ? 00:00:00 nginx: worker process
1997 2960 2954 0 08:59 ? 00:00:00 nginx: worker process
ubuntu 5175 4021 0 09:03 pts/0 00:00:00 grep --color=auto nginx
所以判断是否存在,只要判断数量即可,命令为
ps -ef|grep nginx|wc -l
进程大于1,则进程存在正常,显示如下:
ubuntu@k8s-node1:~$ ps -ef|grep nginx|wc -l
7
2:脚本内容
以下是最简单的判断内容,判断进程数量小于等于1,则进程不存在,然后重启即可。
#!/bin/bash
#set -x 调试脚本可去掉注释
ProcNumber=$(ps -ef |grep -w nginx|wc -l)
if [ ${ProcNumber} -le 1 ];then
systemctl restart nginx #进程不存在,重启服务
fi
shell判断相关参数:
-eq:等于
-ne:不等于
-le:小于等于
-ge:大于等于
-lt:小于
-gt:大于
需注意的坑:
grep 需要加上参数-w
,意为精确匹配。如果不加上-w
,判断进程数量会不准确。
例:判断一个名为info.py
的脚本内容:ps -ef |grep info.py
不加-w
,会把包括info.py
都显示出来,如info_py
,info
之类的。所以显示数量远大于实际进程数量。
所以写脚本时必需加上-w
参数,显示只有info.py的内容。
grep其他参数参考:
-e: 使用正则搜索 #常用查找当前目录下所有文件中包含字符串,如”nginx”的文件,会将含有nginx字符串的所有文件匹配出来
-i: 不区分大小写
-v: 查找不包含指定内容的行 #常用,反向查询,取反。
-w: 按单词搜索
-c: 统计匹配到的次数
-n: 显示行号 #常与-rn搭配使用
-r: 逐层遍历目录查找 #常用,将当前文件夹及子文件夹中查找,常与-rn搭配使用查找某字段在文件中的哪一行。
-A: 显示匹配行及前面多少行, 如: -A3, 则表示显示匹配行及前3行
-B: 显示匹配行及后面多少行, 如: -B3, 则表示显示匹配行及后3行
-C: 显示匹配行前后多少行, 如: -C3, 则表示显示批量行前后3行
--color: 匹配到的内容高亮显示
--include: 指定匹配的文件类型
--exclude: 过滤不需要匹配的文件类型
3:定时任务
脚本完成后,需添加系统定时任务。
crontab -e
#添加脚本位置,每分钟执行一次
*/1 * * * * /bin/bash /script/check_nginx.sh
Pingback引用通告: python小脚本,实时监测服务器是否宕机状态,并发送到指定Telegram群组 - 运维笔记(ywbj.cc)