首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >运维人必须掌握的10个应急脚本(老厉害了)

运维人必须掌握的10个应急脚本(老厉害了)

作者头像
IT运维技术圈
发布2025-10-09 12:01:51
发布2025-10-09 12:01:51
2900
代码可运行
举报
文章被收录于专栏:IT运维技术圈IT运维技术圈
运行总次数:0
代码可运行

0. 写在前面:为什么你需要“神器”而非“常用命令

1. 检查端口占用:check_port

代码语言:javascript
代码运行次数:0
运行
复制
#!/bin/bash
# check_port - 检查指定端口是否被占用

if [ -z "$1" ]; then
  echo "用法: check_port <端口号>"
  exit 1
fi

PORT=$1
echo ">>> 正在检查端口 $PORT ..."
lsof -i:$PORT || echo "端口 $PORT 未被占用"

示例:

代码语言:javascript
代码运行次数:0
运行
复制
$ check_port 22
>>> 正在检查端口 22 ...
sshd     1234 root    3u  IPv4  16777  0t0  TCP *:ssh (LISTEN)

2. 清理僵尸进程:clean_zombie

代码语言:javascript
代码运行次数:0
运行
复制
#!/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

示例:

代码语言:javascript
代码运行次数:0
运行
复制
$ clean_zombie
>>> 正在查找僵尸进程...
>>> 未发现僵尸进程

3. 释放内存缓存:free_cache

代码语言:javascript
代码运行次数:0
运行
复制
#!/bin/bash
# free_cache - 释放系统缓存

echo ">>> 内存释放前:"
free -h
sync
echo 3 > /proc/sys/vm/drop_caches
echo ">>> 内存释放后:"
free -h

示例:

代码语言:javascript
代码运行次数:0
运行
复制
$ 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

4. 日志快速清理:log_clean

代码语言:javascript
代码运行次数:0
运行
复制
#!/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

示例:

代码语言:javascript
代码运行次数:0
运行
复制
$ 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

5. 查看实时连接数:conn_count

代码语言:javascript
代码运行次数:0
运行
复制
#!/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

示例:

代码语言:javascript
代码运行次数:0
运行
复制
$ conn_count 3306
>>> 查看端口 3306 的连接数
42

$ conn_count
>>> 查看系统总连接数
387

6. CPU 占用定位:cpu_hog

代码语言:javascript
代码运行次数:0
运行
复制
#!/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

示例:

代码语言:javascript
代码运行次数:0
运行
复制
$ 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

7. 磁盘 I/O 排查:disk_io

代码语言:javascript
代码运行次数:0
运行
复制
#!/bin/bash
# disk_io - 查看磁盘 I/O 使用情况

echo ">>> 磁盘 I/O 状态 (3 次采样):"
iostat -x 1 3

示例:

代码语言:javascript
代码运行次数:0
运行
复制
$ 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

8. 网络延迟排查:net_latency

代码语言:javascript
代码运行次数:0
运行
复制
#!/bin/bash
# net_latency - 快速排查网络延迟

if [ -z "$1" ]; then
  echo "用法: net_latency <目标主机>"
  exit 1
fi

TARGET=$1
echo ">>> 检测网络到 $TARGET 的延迟 (10 次采样):"
mtr -r -c 10 $TARGET

示例:

代码语言:javascript
代码运行次数:0
运行
复制
$ 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

9. 查找大文件:find_bigfile

代码语言:javascript
代码运行次数:0
运行
复制
#!/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

示例:

代码语言:javascript
代码运行次数:0
运行
复制
$ 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

10. 一键收集系统信息:sys_snapshot

代码语言:javascript
代码运行次数:0
运行
复制
#!/bin/bash
# sys_snapshot - 一键收集系统快照

echo"==== 系统信息 ===="
uname -a
echo"==== CPU ===="
top -b -n1 | head -20
echo"==== 内存 ===="
free -h
echo"==== 磁盘 ===="
df -h
echo"==== 网络 ===="
ss -s

示例:

代码语言:javascript
代码运行次数:0
运行
复制
$ 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档案系列文章:

从告警到CTO:一个P0故障的11小时生死时速

企业级 Kubernetes 集群安全加固全攻略( 附带一键检查脚本)

点击原文链接有老杨新上的实时收集全球vps数据的项目,老厉害了!

老杨的关于AI的号

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2025-08-16,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 IT运维技术圈 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1. 检查端口占用:check_port
  • 2. 清理僵尸进程:clean_zombie
  • 3. 释放内存缓存:free_cache
  • 4. 日志快速清理:log_clean
  • 5. 查看实时连接数:conn_count
  • 6. CPU 占用定位:cpu_hog
  • 7. 磁盘 I/O 排查:disk_io
  • 8. 网络延迟排查:net_latency
  • 9. 查找大文件:find_bigfile
  • 10. 一键收集系统信息:sys_snapshot
  • 整理一下
  • 老杨时间
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档