## 编写一个巡检脚本,用来检测系统里面所有服务是否都正常运行
## 假定系统运行的服务有nginx,mysql,redis,tomcat
## 要求脚本有内容输出,可以明确告知服务是否正常运行
## 如果服务进程存在并且端口监听说明服务正常。
## 进程是否存在使用 pgrep aux |grep 'xxx'
## 端口是否存在使用 ss -lnp |grep 'xxxx'

#!/bin/bash
## 判断pgrep或ss命令是否存在
check_tools()
{
        if ! which pgrep &>/dev/null
        then
                echo "本机没有pgrep命令"
                exit1
        fi
        if ! which ss &>/dev/null
        then
                echo "本机没有ss命令"
                exit 1
        fi
}

## 使用pgrep来检测某服务进程是否存在
## 该函数只有返回值为0或1
## 当返回值为0说明进程存在,返回值为1说明进程不存在
check_ps()
{
        if pgrep "$1" &>/dev/null
        then
                return 0
        else
                return 1
        fi
}

## 使用ss -lnp来检测指定端口是否存在
check_port()
{
        port_n=`ss -lnp|grep ":$1 "|wc -l`
        if [ $port_n -ne 0 ]
        then
                return 0
        else
                return 1
        fi
}

## 只有check_ps和check_port同时返回值为0才能说明指定服务是正常的
check_srv()
{
        if check_ps $1 && check_port $2
        then
                echo "$1服务正常"
        else
                echo "$1服务不正常"
        fi
}


check_tools
check_srv mysql 3306
check_srv java 44064
check_srv gbase 5258

<<'COMMENT'
1)如果将一条命令的结果作为if的判断条件,则当命令执行成功时条件为真,也就是说当返回值为0时,条件为真
2)pgrep后面跟进程名关键字即可将相关进程的pid列出来
COMMENT