一、自动化脚本里最常见的巡检维度¶
原笔记把脚本里常用的检查分成几类:
- 端口:判断端口是否监听、是否能连通
- 进程:判断服务进程是否存在、是否异常
- 网络:判断主机连通性、流量和 DNS 解析
- Web/API:判断 HTTP 请求是否正常
- 系统全能:用综合工具观察系统状态
Shell 自动化之所以离不开这些命令,是因为很多巡检脚本本质上就是:
1、采集一组系统信息 2、用判断逻辑分析结果 3、输出可读结论或触发告警
二、端口检查通常分两步¶
原笔记对端口检查的拆分非常清晰:
2.1 先看端口是否存在¶
也就是确认本机有没有进程在监听指定端口,常用命令包括:
ss -lntup | grep 80
netstat -lntup | grep 80
lsof -i:80
其中:
ss:现代 Linux 上更常用netstat:历史上更常见lsof -i:80:从“占用文件/端口的进程”视角看问题
2.2 再看端口能不能访问¶
监听存在,并不代表一定能从网络上连通。原笔记列出的工具有:
telnet host port
nc -w 1 -z host port
nmap -p 80 host
最常用于自动化脚本的是 nc 和 nmap,因为它们更容易做非交互式判断。
三、除了端口,还要掌握哪些基础巡检命令¶
3.1 进程检查¶
原笔记建议重点掌握:
pstopiotop
这些命令分别适合:
- 看进程是否存在
- 看 CPU 占用和系统整体运行态势
- 看 IO 压力是否异常
3.2 网络检查¶
原笔记提到:
ping:检查基础连通性iftop:看网络流量dig:看 DNS 解析
其中 ping 的两个常用参数值得记住:
ping -c 2 -W 1 192.168.1.20
-c:发送次数-W:等待超时时间
3.3 Web 和 API 检查¶
Web 层最常见的检查工具是:
curlwget
原笔记还专门点了 curl 常用参数:
-v:显示详细交互信息-L:跟随跳转-H:自定义请求头-I:只取响应头-w:按格式输出-o:把内容输出到文件-s:静默模式
3.4 系统级综合观察¶
原笔记推荐了 atop:
yum install atop -y
systemctl enable atop
systemctl start atop
atop
它适合做更综合的系统分析,尤其是在需要同时看 CPU、内存、磁盘和进程行为的时候。
四、实战:检查指定主机端口是否可访问¶
原笔记给出的综合案例,是用 Shell 脚本检查目标地址的端口是否可用:
#!/bin/bash
url=$1
port=$2
. /etc/init.d/functions
[ $# -ne 2 ] && {
action "请输入url 端口" /bin/false
exit 1
}
[[ $port =~ ^[0-9]+$ ]] || {
action "请输入有效的端口" /bin/false
exit 2
}
port_count=$(nmap -p $port $url | grep -wc open)
if [ $port_count -eq 1 ]; then
action "$url $port 是通畅的" /bin/true
else
action "$url $port 是不通畅的" /bin/false
fi
这个脚本的关键点在于:
- 先检查参数个数
- 再检查端口格式
- 再用工具做实际连通性验证
- 最后输出统一结果
这已经是一个很典型的巡检脚本骨架。
五、非交互式端口测试还可以怎么做¶
原笔记还补充了 telnet 和 nc 的用法。
5.1 telnet 的非交互检查方式¶
echo q | telnet -e q 192.168.1.20 22
echo $?
如果返回值为 0,通常说明连接成功。
5.2 用 nc 直接写进判断¶
if nc -w 1 -z $dst $port; then
action "地址:$dst 端口:$port is ok" /bin/true
else
action "地址:$dst 端口:$port is failed" /bin/false
fi
在很多现代环境里,nc 会比 telnet 更适合脚本化使用。
六、实战:检查指定 URL 是否正常¶
原笔记第二个案例,是对 URL 进行健康检查:
#!/bin/bash
url=$1
check_url() {
[[ $url =~ ^[0-9a-zA-Z./:]+$ ]] || {
echo "请输入有效的URL地址"
exit 1
}
}
url_status() {
status_code=$(curl -s -I $url | awk 'NR==1{print $2}')
[ -z "$status_code" ] && {
echo "$url 请求失败"
exit 2
}
if [ $status_code -lt 400 ]; then
echo "URL正常"
else
echo "$url 请求失败"
fi
}
main() {
check_url
url_status
}
main
这个脚本背后的思路非常值得复用:
- 用正则先做格式校验
- 用
curl -I取响应头 - 用状态码判断请求是否成功
七、wget 也是 URL 检查的备用方案¶
原笔记同时给出了 wget 的无输出探测方式:
wget -q --spider www.baidu.com
echo $?
这里的返回值也能直接拿来做判断:
0:请求成功- 非
0:请求失败
当环境里没有 curl 或你希望更轻量地做“站点能否访问”的判断时,这种写法很实用。
八、写巡检脚本时最推荐的套路¶
把原笔记的巡检案例合并起来,可以总结成下面这套固定流程:
1、接参数。 2、校验参数格式。 3、调用系统命令采集状态。 4、用判断逻辑得出结论。 5、输出成功/失败结果。
无论你是在写端口检测、接口探活,还是服务上线前的预检脚本,基本都可以沿用这套结构。