如何编写Shell脚本按环境登录服务器并检查进程运行状态
当然可以实现!我刚好写过类似的脚本,给你整理了一个完整的方案,不仅能完成你要的检查,还会输出清晰的结果,方便你快速定位问题。
完整Bash脚本实现
#!/bin/bash # 定义需要检查的服务器、环境和进程列表 SERVERS=("serv01" "serv02" "serv03") ENVIRONMENTS=("Dev" "Staging" "Prod") PROCESSES=("module01" "module02" "module03") # 定义合格阈值:运行的进程数≥2则达标 THRESHOLD=2 # 遍历每台服务器 for server in "${SERVERS[@]}"; do echo "=== 正在检查服务器: $server ===" # 遍历每个环境 for env in "${ENVIRONMENTS[@]}"; do echo "--- 检查环境: $env ---" # 拼接进程正则,用于过滤ps结果 proc_regex=$(IFS="|"; echo "${PROCESSES[*]}") # 通过SSH远程执行进程检查命令,统计运行中的目标进程数 running_count=$(ssh "$server" "ps aux | grep -E '$env' | grep -E '$proc_regex' | grep -v grep | wc -l") # 输出当前统计结果 echo "当前环境下运行的目标进程数: $running_count" # 判断是否满足阈值要求 if [ "$running_count" -ge "$THRESHOLD" ]; then echo "*状态正常*: 运行进程数达标(≥$THRESHOLD)" else echo "*警告*: 运行进程数不足,仅$running_count个进程在运行" fi echo "" done done
关键部分解释
- 变量定义:把服务器、环境、进程都做成数组,后续要修改或者扩展的话,直接改数组内容就行,非常灵活。
- SSH远程执行:脚本默认你已经配置了免密SSH登录(如果没配置,先执行
ssh-copy-id serv01这类命令配置,不然每次要输密码会很麻烦)。 - 进程过滤逻辑:
grep -E '$env':先筛选出对应环境的进程grep -E '$proc_regex':再从环境进程里筛选出目标模块grep -v grep:排除掉grep命令本身的进程,避免统计错误wc -l:统计最终符合条件的进程行数,也就是运行中的进程数量
- 阈值判断:用
[ "$running_count" -ge "$THRESHOLD" ]判断是否达到要求,输出对应的状态提示。
注意事项
- 免密登录配置:确保本地用户可以无密码登录到三台服务器,否则脚本会卡在输入密码的环节。
- 进程名准确性:要确认
ps aux输出里的进程名确实包含Dev/Staging/Prod和module01/module02/module03,如果命名规则不一样,要调整grep的匹配规则。 - 权限问题:执行脚本的用户需要有远程服务器的登录权限,以及执行
ps命令的权限。 - 扩展调整:如果后续要加服务器、环境或者进程,直接修改开头的数组即可;如果要调整阈值(比如改成≥3),修改
THRESHOLD变量的值就行。
内容的提问来源于stack exchange,提问作者Kart
相关产品推荐
相关产品推荐

