【shell一天一练】巡检脚本ps命令、pgrep命令

98 阅读1分钟

今日小练题目📢

编写一个巡检脚本,用来检测系统里面所有服务是否都正常运行。 假定,系统运行的服务有Nginx、MySQL、Redis、Tomcat 要求脚本有内容输出,可以明确告知服务是否正常运行。

优秀作业🤌🏻

#!/bin/bash
#author:xYLiuuuuuu
#version:v1
#date:2024-12-20

check_tools()
{
        if ! which pgrep &>/dev/null
        then
                echo "本机没有pgrep命令"
                exit 1
        fi

        if ! which ss &>/dev/null
        then
                echo "本机没有ss命令"
                exit 1
        fi
}

check_ps()
{
        if pgrep "$1" &>/dev/null
        then
                return 0
        else
                return 1
        fi
}

check_ss()
{
        port_n=`ss -lnp|grep ":$1 "|wc -l`
        if [ $port_n -ne 0 ]
        then
                return 0
        else
                return 1
        fi
}

check_srv()
{
        if check_ps $1 && check_port $2
        then
                echo "$1服务正常"
        else
                echo "$1服务不正常"
        fi
}

check_tools
check_srv mysql 3306
check_srv redis 6379
check_srv nginx 443
check_srv java 8825

敲黑板📝

  • 如果将一条命令的结果作为if的判断条件,则当命令执行成功时条件为真,也就是说当返回值为0时,条件为真.....所以要取反❗
  • pgrep后面跟进程名关键字即可将相关进程的pid列出来
# 加-i参数不区分大小写
$ pgrep -i ssh

# 自定义输出分隔符
$ pgrep -d , sshd 
1709,97535,97549  

# 同时显示PID和ProcessName
$ pgrep -l sshd
3686 sshd
7907 sshd
8815 sshd
12874 sshd

# 加-a参数显示用于启动每个进程的完整命令
$ pgrep -u himanshu -a

# -o 当匹配多个进程时,显示进程号最小的那个
# -n 当匹配多个进程时,显示进程号最大的那个

image.png

  • 查看端口进程等的命令有

    • lsof -i :80:列出所有正在使用 80 端口的进程。
    • netstat -tulnp | grep 8080:查找占用8080端口的进程。
      • 其中-t表示显示 TCP 连接,-u表示显示 UDP 连接,-n表示以数字形式显示地址和端口,-l表示显示监听状态的端口,-p表示显示对应的程序和 PID。
    • ps aux | grep tomcat:显示tomcat的进程信息。
    • lsof -i:22可以查看占用端口 22 的程序。
  • ps命令

# 查看CPU/内存占用率最高的进程
# -降序+升序 pcpuCPU pmem内存
$ps -aux --sort=-pcpu | head -11
$ps -aux --sort=+pmem | head -11
# 如果不限制行数,也可以使用sort按照指定的列排序
$ps -aux | sort -nk 4 -r 降序
$ps -aux | sort -nk 4

# 查看某个用户开启了哪些线程
$ps -u root -ef

# 分页查看进程
$ps -ef | more