Linux 实用小脚本6(检测nginx服务,如果服务未运行,自动启动服务)
#!/biu/bash
#!author zsk_john
#count=`ps -ef|grep nginx|grep -v grep|grep -v $0|wc -l`
count=`/sbin/pidof nginx | wc -l`
echo $count
if [ $count -eq 0 ];then
echo -e "\033[40;31m start nginx process.....\033[0m"
service nginx restart
else
echo -e "\033[40;32m nginx is runing.....\033[0m"
fi
脚本内容解释:
count=`ps -ef|grep nginx|grep -v grep|grep -v $0|wc -l` 反引号表示返回命令的值。
count=`/sbin/pidof nginx | wc -l` 和上面的是一致的,但不需要grep检索过滤了。任选一个使用即可。
其中,grep -v grep是去掉查询出的结果集内的grep程序。示例:
[root@centos8 ~]# ps -ef |grep nginx |grep -v grep
root 3104 1 0 21:03 ? 00:00:00 nginx: master process /www/server/nginx/sbin/nginx -c /www/server/nginx/conf/nginx.conf
www 3105 3104 0 21:03 ? 00:00:00 nginx: worker process
www 3106 3104 0 21:03 ? 00:00:00 nginx: worker process
www 3107 3104 0 21:03 ? 00:00:00 nginx: worker process
www 3108 3104 0 21:03 ? 00:00:00 nginx: worker process
www 3109 3104 0 21:03 ? 00:00:00 nginx: cache manager process
[root@centos8 ~]# ps -ef |grep nginx
root 3104 1 0 21:03 ? 00:00:00 nginx: master process /www/server/nginx/sbin/nginx -c /www/server/nginx/conf/nginx.conf
www 3105 3104 0 21:03 ? 00:00:00 nginx: worker process
www 3106 3104 0 21:03 ? 00:00:00 nginx: worker process
www 3107 3104 0 21:03 ? 00:00:00 nginx: worker process
www 3108 3104 0 21:03 ? 00:00:00 nginx: worker process
www 3109 3104 0 21:03 ? 00:00:00 nginx: cache manager process
root 3658 1577 0 21:12 pts/1 00:00:00 grep --color=auto nginx
可以看到,最后一行的内容不是nginx的进程,只是grep命令的进程。这一行是不需要的干扰项, 所以 grep -v了。
grep -v $0 这个也是排除干扰,$0 代表脚本文件名称,如果脚本名称带有nginx,那么,运行脚本的时候会多检索出两个含有nginx的进程,这个不太好检测出来(脚本运行完了,那两个进程也就自己结束了,无法直观的观察到),不过,echo $count这一行可以看出是取出变量值有问题的,如果没有这个排除项的话。(脚本名称包含需要检测的服务和不包含需要检测的服务,运行后,变量值是不一样的,一般是多2,这里比较饶舌,需要静心理解)。
因此,grep -v $0是必须有的,不信的同学可以将该项去掉,观察 echo $count所取出的变量值。
前面排除了所有干扰,那么,检索到了nginx的进程列就表示nginx是启动的状态。
if [ $count -eq 0 ];then
echo -e "\033[40;31m start nginx process.....\033[0m"
service nginx restart
该变量值范围可以限定为0和非0,0代表未检索到nginx的进程列,也就是说nginx未启动,脚本内直接执行nginx的启动命令即可。
else
echo -e "\033[40;32m nginx is runing.....\033[0m"
fi
非零的情况下,nginx已经是启动的,无需任何动作,打印提示nginx 正在运行即可。fi是if语句的结束。
总结:
当然了,其他的服务检测也是这一个模式,进程名称换掉,启动服务的命令换掉即可。或者,别的脚本大体形式改变,改为for循环或者while循环,但意义并不大,细节方面还是if语句判断作为服务状态的检测,只是可能不是通过查询进程,而是通过服务本身的状态查询命令而已。