0. 写在前面:为什么你需要“神器”而非“常用命令
check_port
#!/bin/bash
# check_port - 检查指定端口是否被占用
if [ -z "$1" ]; then
echo "用法: check_port <端口号>"
exit 1
fi
PORT=$1
echo ">>> 正在检查端口 $PORT ..."
lsof -i:$PORT || echo "端口 $PORT 未被占用"
示例:
$ check_port 22
>>> 正在检查端口 22 ...
sshd 1234 root 3u IPv4 16777 0t0 TCP *:ssh (LISTEN)
clean_zombie
#!/bin/bash
# clean_zombie - 查找并尝试清理僵尸进程
echo">>> 正在查找僵尸进程..."
ps -ef | grep defunct | grep -v grep
ZOMBIE=$(ps -ef | grep defunct | grep -v grep | awk '{print $2}')
if [ -n "$ZOMBIE" ]; then
echo">>> 尝试杀死僵尸进程: $ZOMBIE"
kill -9 $ZOMBIE
else
echo">>> 未发现僵尸进程"
fi
示例:
$ clean_zombie
>>> 正在查找僵尸进程...
>>> 未发现僵尸进程
free_cache
#!/bin/bash
# free_cache - 释放系统缓存
echo ">>> 内存释放前:"
free -h
sync
echo 3 > /proc/sys/vm/drop_caches
echo ">>> 内存释放后:"
free -h
示例:
$ sudo free_cache
>>> 内存释放前:
total used free shared buff/cache available
Mem: 15G 10G 1.5G 512M 3.5G 4.0G
Swap: 2G 200M 1.8G
>>> 内存释放后:
total used free shared buff/cache available
Mem: 15G 9.2G 2.2G 512M 3.6G 4.8G
Swap: 2G 200M 1.8G
log_clean
#!/bin/bash
# log_clean - 快速清理指定日志文件
if [ -z "$1" ]; then
echo"用法: log_clean <日志文件路径>"
exit 1
fi
LOGFILE=$1
if [ -f "$LOGFILE" ]; then
echo">>> 清理日志文件: $LOGFILE"
cat /dev/null > "$LOGFILE"
else
echo"文件不存在: $LOGFILE"
fi
示例:
$ ls -lh /var/log/nginx/error.log
-rw-r--r-- 1 root root 120M Aug 16 10:21 /var/log/nginx/error.log
$ sudo log_clean /var/log/nginx/error.log
>>> 清理日志文件: /var/log/nginx/error.log
$ ls -lh /var/log/nginx/error.log
-rw-r--r-- 1 root root 0 Aug 16 10:22 /var/log/nginx/error.log
conn_count
#!/bin/bash
# conn_count - 查看实时 TCP 连接数
PORT=$1
if [ -n "$PORT" ]; then
echo ">>> 查看端口 $PORT 的连接数"
netstat -an | grep ESTABLISHED | grep ":$PORT " | wc -l
else
echo ">>> 查看系统总连接数"
netstat -an | grep ESTABLISHED | wc -l
fi
示例:
$ conn_count 3306
>>> 查看端口 3306 的连接数
42
$ conn_count
>>> 查看系统总连接数
387
cpu_hog
#!/bin/bash
# cpu_hog - 定位某进程内最高 CPU 线程
if [ -z "$1" ]; then
echo "用法: cpu_hog <PID>"
exit 1
fi
PID=$1
echo ">>> 正在分析进程 $PID 的线程情况..."
top -Hp $PID | head -20
示例:
$ cpu_hog 1234
>>> 正在分析进程 1234 的线程情况...
top - 10:30:45 up 3 days, 5:12, 2 users, load average: 1.35, 0.89, 0.73
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
1255 mysql 20 0 1640m 320m 9500 S 95.0 2.1 2:14.15 mysqld
disk_io
#!/bin/bash
# disk_io - 查看磁盘 I/O 使用情况
echo ">>> 磁盘 I/O 状态 (3 次采样):"
iostat -x 1 3
示例:
$ disk_io
>>> 磁盘 I/O 状态 (3 次采样):
Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await svctm %util
sda 0.2 1.0 5.3 7.1 120 310 57.2 0.04 5.2 0.6 8.3
net_latency
#!/bin/bash
# net_latency - 快速排查网络延迟
if [ -z "$1" ]; then
echo "用法: net_latency <目标主机>"
exit 1
fi
TARGET=$1
echo ">>> 检测网络到 $TARGET 的延迟 (10 次采样):"
mtr -r -c 10 $TARGET
示例:
$ net_latency www.baidu.com
>>> 检测网络到 www.baidu.com 的延迟 (10 次采样):
HOST: server.example.com
Loss% Snt Last Avg Best Wrst StDev
1.|-- 192.168.1.1 0.0% 10 1.2 1.1 0.8 1.5 0.2
2.|-- 10.10.10.1 0.0% 10 8.5 8.7 7.9 9.4 0.3
3.|-- 220.181.38.148 0.0% 10 24.2 24.5 23.7 25.1 0.4
find_bigfile
#!/bin/bash
# find_bigfile - 查找指定目录下最大文件
DIR=$1
if [ -z "$DIR" ]; then
DIR="/"
fi
echo ">>> 正在扫描目录 $DIR 下最大文件..."
du -ah $DIR 2>/dev/null | sort -rh | head -n 10
示例:
$ find_bigfile /var/log
>>> 正在扫描目录 /var/log 下最大文件...
450M /var/log/messages.1
320M /var/log/nginx/access.log
180M /var/log/secure
120M /var/log/nginx/error.log
sys_snapshot
#!/bin/bash
# sys_snapshot - 一键收集系统快照
echo"==== 系统信息 ===="
uname -a
echo"==== CPU ===="
top -b -n1 | head -20
echo"==== 内存 ===="
free -h
echo"==== 磁盘 ===="
df -h
echo"==== 网络 ===="
ss -s
示例:
$ sys_snapshot
==== 系统信息 ====
Linux server1 5.15.0-81-generic #90-Ubuntu SMP x86_64 GNU/Linux
==== CPU ====
top - 10:40:01 up 3 days, 5:22, 2 users, load average: 0.48, 0.62, 0.71
Tasks: 200 total, 1 running, 199 sleeping, 0 stopped, 0 zombie
%Cpu(s): 3.0 us, 1.0 sy, 0.0 ni, 95.0 id, 1.0 wa, 0.0 hi, 0.0 si, 0.0 st
==== 内存 ====
total used free shared buff/cache available
Mem: 15G 9G 3.2G 512M 2.8G 5.4G
==== 磁盘 ====
Filesystem Size Used Avail Use% Mounted on
/dev/sda1 50G 20G 27G 43% /
==== 网络 ====
Total: 232 (TCP: 185, UDP: 32, RAW: 15)
脚本名称 | 场景 | 命令入口 | 风险提示 | ||
---|---|---|---|---|---|
检查端口占用 | 服务启动失败,端口冲突 | lsof -i:端口号 | 误 kill 可能中断正常服务 | ||
清理僵尸进程 | 系统卡顿,僵尸进程堆积 | `ps -ef | grep defunct` | 小心误杀关键父进程 | |
释放内存缓存 | 内存不足,应用 OOM | echo 3 > /proc/sys/vm/drop_caches | 缓存命中率下降 | ||
磁盘快速清理 | 磁盘写满,日志暴涨 | du -sh /var/log/* | 清理前最好备份 | ||
查看实时连接数 | 连接暴增,应用异常 | `netstat -an | grep ESTABLISHED` | 高并发时输出巨大 | |
CPU 占用定位 | 单进程 CPU 占满 | top -Hp PID | 高危操作需谨慎 | ||
磁盘 I/O 排查 | 应用卡顿,磁盘瓶颈 | iostat -x 1 3 | 输出解读需要经验 | ||
网络延迟排查 | 应用掉线,怀疑网络抖动 | mtr -r -c 10 host | 防火墙可能拦截部分检测 | ||
查找大文件 | 磁盘空间告警 | `du -ah / | sort -rh | head -n 10` | 注意不要误删重要文件 |
一键收集故障信息 | 综合场景,快速交接分析 | 自定义脚本 | 输出内容可能过多 |
这里我先声明一下,日常生活中大家都叫我波哥,跟辈分没关系,主要是岁数大了.就一个代称而已. 我的00后小同事我喊都是带哥的.张哥,李哥的. 但是这个称呼呀,在线下参加一些活动时.金主爸爸也这么叫就显的不太合适. 比如上次某集团策划总监,公司开大会来一句:“今个咱高兴!有请IT运维技术圈的波哥讲两句“ 这个氛围配这个称呼在互联网这行来讲就有点对不齐! 每次遇到这个情况我就想这么接话: “遇到各位是缘分,承蒙厚爱,啥也别说了,都在酒里了.我干了,你们随意!” 所以以后咱们改叫老杨,即市井又低调.还挺亲切,我觉得挺好.
运维X档案系列文章:
企业级 Kubernetes 集群安全加固全攻略( 附带一键检查脚本)
点击原文链接有老杨新上的实时收集全球vps数据的项目,老厉害了!
老杨的关于AI的号