新手必会:20个最常用的 Linux 命令详解
背景与适用场景
Linux 命令行是运维工作的根基。无论是排查故障、分析性能,还是批量操作服务器,命令行都是最直接、最高效的手段。相比图形界面,命令行的优势在于:可以精确控制、可编写脚本重复执行、可通过 SSH 远程操作、可结合管道实现复杂的数据处理。
在生产环境中,运维工程师每天打交道最多的就是命令行工具。一个熟练的运维工程师,看到一个错误现象,能在几秒内定位到应该用哪个命令、查看哪个输出、判断哪个指标。这一点靠的是对命令的肌肉记忆和对系统行为的理解。
本文面向初中级运维工程师和系统管理员,选取了日常工作中最常用的 20 个 Linux 命令,分成五类讲解:文件与目录操作、文本查看与处理、权限与所有者、磁盘与文件系统、进程与资源、网络诊断。每个命令都给出详细参数说明、实战用法和避坑指南。
为什么要讲这 20 个命令?因为根据笔者多年的运维经验,这 20 个命令覆盖了 80% 以上的日常操作场景。把这 20 个命令用熟练,比去背几百个不常用的命令强得多。
第一部分:文件与目录操作
文件与目录操作是最基础的一类命令。ls、cd、cp、mv、rm 这五个命令,几乎每天都要用到。
1. ls — 目录内容查看
ls 是 list 的缩写,用于列出目录内容。这是查看文件结构最常用的命令。
基本用法
ls /var/log
这条命令列出 /var/log 目录下的所有文件和子目录。
常用参数
-l:以长格式显示,包含文件类型、权限、链接数、所有者、所属组、大小、修改时间-h:配合 -l 使用,以人类可读的方式显示文件大小(K、M、G)
实战示例
查看当前目录下所有文件的详细信息,包括隐藏文件:
ls -lha
输出示例:
total 28drwxr-xr-x 3 root root 4096 May 29 10:30 .drwxrwxr-x 9 root root 4096 May 29 09:00 ..-rw-r--r-- 1 root root 862 May 29 10:30 .bashrc-rw-r--r-- 1 root root 182 May 28 14:20 .profiledrwxr-xr-x 2 root root 4096 May 29 08:45 cache-rw-r--r-- 1 root root 12K May 29 10:30 error.log-rw-r--r-- 1 root root 45M May 29 09:15 application.log
解释一下每列的含义:
- 第一列:文件类型和权限。
d 开头表示目录,- 开头表示普通文件,l 开头表示符号链接
按文件大小排序,找出最大的几个文件:
ls -lhS /var/log | head -20
按修改时间排序,找出最近修改的文件:
ls -lt /var/log | head -20
避坑指南
- ls 默认不显示隐藏文件,如果要看隐藏文件必须加 -a 参数
- ls -l 显示的大小是字节数,对于大文件可能很难读。加 -h 参数显示为 K、M、G 单位
- ls 的时间显示是最后修改时间,不是创建时间。Linux 文件系统不记录创建时间
- 在生产环境查看大目录时,ls 可能很慢。可以用
ls -U 按物理顺序显示,跳过排序步骤
2. cd — 目录切换
cd 是 change directory 的缩写,用于切换当前工作目录。
基本用法
cd /var/log
切换到 /var/log 目录。
常用技巧
切换到当前用户的家目录:
cd ~
或者直接输入:
cd
切换到上一个工作目录:
cd -
返回上一层目录:
cd ..
实战示例
在 shell 脚本中切换到特定目录并执行操作:
#!/bin/bashcd /var/log/myappls -la *.log
注意:cd 命令如果失败,后续命令会在错误的目录下执行。在脚本中应该加上判断:
#!/bin/bashif ! cd /var/log/myapp 2>/dev/null; thenecho"目录不存在或无法访问"exit 1fils -la *.log
绝对路径与相对路径
绝对路径以 / 开头,从根目录开始定位:
cd /var/log/nginx
相对路径从当前目录开始定位:
# 当前在 /varcdlog/nginx
避坑指南
- 路径中不要随意省略 ~,因为 ~ 代表当前用户的家目录,不同用户执行结果不同
- 脚本中尽量使用绝对路径,避免因当前工作目录不同而出现意外
- 路径中的空格需要转义:
cd "My Documents" 或 cd My\ Documents
3. cp — 文件复制
cp 是 copy 的缩写,用于复制文件或目录。
基本用法
复制单个文件:
cp /var/log/syslog /tmp/syslog.bak
复制并改名:
cp /var/log/syslog /tmp/backup_syslog
常用参数
-u:只复制源文件比目标文件新或目标文件不存在的情况--preserve:指定要保留的属性,如 --preserve=mode,ownership,timestamps
实战示例
备份整个日志目录:
cp -r /var/log/myapp /tmp/myapp_backup_$(date +%Y%m%d)
说明:$(date +%Y%m%d) 是命令替换,生成当前日期字符串,如 20260529。
保留原属性复制配置文件:
cp -p /etc/nginx/nginx.conf /tmp/nginx.conf.bak
备份时显示详细信息:
cp -rv /data/app /backup/app_$(date +%Y%m%d_%H%M%S)
避坑指南
- 默认情况下 cp 会覆盖已存在的同名文件,不会提示。加
-i 可以开启确认 - 复制大文件时,如果目标磁盘空间不足,cp 会失败但不删除已复制的部分,可能造成磁盘空间浪费
- 复制链接文件时,默认复制的是链接本身而不是指向的文件。如果想复制链接指向的文件,使用
cp -L - 生产环境复制重要文件前,最好先检查目标磁盘空间:
df -h /backup
检查磁盘空间后再复制
# 检查目标磁盘空间df -h /backup# 检查源文件大小ls -lh /data/app# 确认空间足够后再复制cp -r /data/app /backup/app_backup
4. mv — 文件移动与重命名
mv 是 move 的缩写,用于移动或重命名文件。
基本用法
移动文件到另一个目录:
mv /var/log/myapp.log /tmp/myapp.log
重命名文件:
mv /tmp/myapp.log /tmp/myapp.old.log
常用参数
-u:只移动源文件比目标文件新或目标文件不存在的情况
实战示例
按日期归档日志文件:
mv /var/log/myapp.log /var/log/archive/myapp_$(date +%Y%m%d).log
批量重命名:将目录下所有 .txt 文件改为 .log:
# 方法一:使用 rename 命令(如果系统有安装)rename 's/\.txt$/\.log/' *.txt# 方法二:使用循环for f in *.txt; do mv "$f""${f%.txt}.log"done
将文件移动到以日期命名的目录:
# 创建以日期命名的目录mkdir -p /backup/$(date +%Y%m%d)# 移动文件mv /data/important.db /backup/$(date +%Y%m%d)/important.db
避坑指南
- mv 默认覆盖已存在的同名文件,不会提示。使用
-i 可以开启确认 - 移动系统文件(如 /etc/passwd)时要格外小心,确保知道后果
- 批量重命名时,建议先用
ls 预览要操作的文件,确认无误后再执行
5. rm — 文件删除
rm 是 remove 的缩写,用于删除文件或目录。这是最危险的命令之一,误删后很难恢复。
基本用法
删除单个文件:
rm /tmp/tempfile.txt
常用参数
实战示例
删除目录下所有 .log 文件(带确认提示):
rm -i /var/log/myapp/*.log
删除整个目录及内容(带确认提示):
rm -ri /tmp/myapp_backup
强制删除所有临时文件:
rm -rf /tmp/myapp_temp_*
危险操作演示
以下命令极具破坏性,绝对不能在生产环境执行:
# 删除根目录 - 灾难性的,不要执行rm -rf /# 删除 /etc 目录 - 不要执行rm -rf /etc# 删除 /var/log 目录 - 不要执行rm -rf /var/log# 删除了整个用户家目录 - 不要执行rm -rf ~/*
安全建议
- 使用
-i 参数开启确认提示,尤其是在 shell 脚本中 - 生产环境执行删除操作前,先用
ls 预览要删除的文件 - 设置别名保护:
alias rm='rm -i',但注意这在 root 用户下可能被 -f 参数覆盖
查看危险别名
# 查看 rm 是否被别名保护alias rm# 如果输出是 alias rm='rm -i',说明有保护
恢复误删文件
如果不小心误删了文件,可以尝试以下方法恢复,但不一定成功:
- 如果是 ext4 文件系统,可以尝试使用
extundelete 工具恢复(需要提前安装) - 如果是 xfs 文件系统,可以使用
xfsdump 备份恢复
最好的防护是做好备份和权限控制,而不是依赖恢复。
第二部分:文本查看与处理
文本查看与处理是日志分析、配置检查、数据统计的基础。cat、grep、head/tail、wc 这几个命令组合起来,可以解决大部分文本处理需求。
6. cat — 文件内容查看
cat 是 concatenate 的缩写,用于查看文件内容或连接多个文件。
基本用法
查看整个文件内容:
cat /etc/passwd
合并多个文件:
cat file1.txt file2.txt > combined.txt
在文件末尾追加内容:
cat >> file.txt <<EOF这是新追加的行EOF
常用参数
-A:显示所有字符,包括控制字符(如 Tab 显示为 ^I,换行显示为 $)
实战示例
查看文件并显示行号(适合排查配置错误):
cat -n /etc/nginx/nginx.conf | head -50
查看文件并压缩空行:
cat -s /var/log/myapp.log
查看文件并显示所有控制字符(检查行尾是否正确):
cat -A /etc/passwd
正常行尾: $Windows 换行符:^M$Unix 换行符:$
避坑指南
- cat 会一次性把整个文件加载到内存,对于大文件(如几个 G 的日志)会导致内存耗尽。查看大文件应该用 less 或 tail
- cat 适合查看小文件或配置文件的完整性,不适合查看长文件
- 二进制文件不要用 cat 查看,会在终端输出乱码,可能导致终端行为异常。如果不小心查看了二进制文件,输入
reset 命令恢复终端
查看大文件的正确方式
# 分页查看大文件less /var/log/myapp.log# 只看前 100 行head -100 /var/log/myapp.log# 只看最后 100 行tail -100 /var/log/myapp.log# 实时监控文件变化(追加的内容)tail -f /var/log/myapp.log
7. grep — 文本搜索
grep 是 global regular expression print 的缩写,是最强大的文本搜索工具之一。
基本用法
在文件中搜索包含特定字符串的行:
grep "error" /var/log/myapp.log
常用参数
实战示例
搜索错误日志:
grep -i "error" /var/log/myapp.log | head -50
搜索多个关键词(满足任一即可):
grep -E "error|fatal|exception" /var/log/myapp.log
搜索并显示匹配行的前后 5 行(查看上下文):
grep -B 5 -A 5 "timeout" /var/log/myapp.log
统计关键词出现次数:
grep -c "error" /var/log/myapp.log
找出所有包含关键词的文件:
grep -l "database connection" /var/log/*.log
递归搜索目录中所有文件:
grep -r "Failed password" /var/log/secure
使用正则表达式搜索 IP 地址:
grep -E "([0-9]{1,3}\.){3}[0-9]{1,3}" /var/log/myapp.log
grep 与管道结合
grep 经常和其他命令结合使用:
# 查看当前所有进程ps aux# 查找特定进程ps aux | grep nginx# 查看某个用户的进程ps -u www-data# 过滤健康检查日志(假设健康检查路径是 /health)tail -f /var/log/myapp.log | grep -v "/health"
性能优化
搜索大文件时,grep 可能很慢。优化方法:
- 使用
--mmap 选项(如果内核支持):grep --mmap "pattern" largefile.log - 先用
grep -F 搜索固定字符串,比正则表达式快 - 如果文件是压缩格式,使用
zgrep 搜索压缩文件 - 考虑使用
ripgrep(rg)替代 grep,它更快且默认支持多种高级特性
# 安装 ripgrep(如果可用)apt install ripgrep # Debian/Ubuntuyum install ripgrep # CentOS/RHEL# 使用 ripgreprg "error" /var/log/myapp.log
避坑指南
- grep 默认使用基本正则表达式,一些特殊字符需要转义。如果使用扩展正则表达式,加
-E 参数 - 搜索的字符串如果包含特殊字符(如 $、*、?),需要转义或加引号
- 如果搜索目录,grep 默认只搜索普通文件,不会跟随符号链接。使用
-R 可以跟随符号链接
8. head 与 tail — 文件头部和尾部查看
head 用于查看文件开头部分,tail 用于查看文件结尾部分。这两个命令在日志分析中非常有用。
head 基本用法
head /var/log/myapp.log
默认显示前 10 行。
head 常用参数
tail 基本用法
tail /var/log/myapp.log
默认显示最后 10 行。
tail 常用参数
-F:实时监控文件,如果文件被删除或重命名,会继续监控新文件--retry:持续尝试打开文件(配合 -F 使用)
实战示例
查看配置文件的前 50 行:
head -n 50 /etc/nginx/nginx.conf
查看日志的最后 100 行:
tail -n 100 /var/log/myapp.log
实时监控日志文件:
tail -f /var/log/myapp.log
实时监控并高亮显示错误:
tail -f /var/log/myapp.log | grep --color=auto -E "error|fatal|exception|$"
监控多个日志文件:
tail -f /var/log/myapp/*.log
查看文件末尾并持续监控(文件轮转场景):
tail -F /var/log/myapp.log
当日志文件被轮转(从 myapp.log 变成 myapp.log.1),tail -F 会自动开始监控新的 myapp.log 文件。
分析日志增长量
想知道日志文件每分钟增长多少行:
# 先记录当前行数before=$(wc -l < /var/log/myapp.log)sleep 60after=$(wc -l < /var/log/myapp.log)echo"每分钟增长: $((after - before)) 行"
查找特定时间段的日志
# 查看 2026-05-29 10点到11点之间的日志# 假设日志格式是 [2026-05-29 10:30:00] 这种格式grep "2026-05-29 1[0-1]:" /var/log/myapp.log
tail 与日志轮转
日志文件被轮转后,tail -f 会继续监控原文件描述符,可能看不到新文件内容。使用 -F 参数可以自动适应日志轮转:
# 不推荐:日志轮转后失效tail -f /var/log/myapp.log# 推荐:自动适应日志轮转tail -F /var/log/myapp.log
避坑指南
- tail -f 会一直占用终端,直到按 Ctrl+C 退出
- 查看大文件时,head 和 tail 比 cat 更高效
- tail -f 监控的文件如果被删除,监控会失效。使用
-F 可以处理这种情况 - 如果日志格式不包含时间戳,难以直接用 grep 按时间过滤。这种情况建议使用 awk 或专用日志分析工具
9. wc — 行数统计
wc 是 word count 的缩写,用于统计文件的行数、单词数、字节数。
基本用法
wc /var/log/myapp.log
输出格式:行数 单词数 字节数 文件名
常用参数
实战示例
统计日志文件总行数:
wc -l /var/log/myapp.log
统计目录下所有日志文件的总行数:
wc -l /var/log/myapp/*.log
统计当前目录下的文件数量(相当于 ls | wc -l):
ls -1 | wc -l
查找行数最多的文件:
wc -l /var/log/*.log | sort -n | tail -5
统计日志中错误出现的次数:
grep -c "error" /var/log/myapp.log
或者:
grep "error" /var/log/myapp.log | wc -l
管道结合使用
统计当前登录用户数:
who | wc -l
统计 TCP 连接数:
netstat -an | grep ESTABLISHED | wc -l
或者使用 ss(更快):
ss -tan state established | wc -l
统计进程数:
ps aux | wc -l
注意:ps aux | wc -l 的输出包含标题行,所以实际进程数要减 1。
避坑指南
- wc -l 统计的是换行符数量,如果文件最后一行没有换行符,实际行数会少 1
- 统计单词数时,wc 按空格和换行符分割,中文文本统计不准确
第三部分:权限与所有者
Linux 的权限模型是运维工程师必须掌握的核心概念。chmod 和 chown 是最常用的权限管理命令。
10. chmod — 权限修改
chmod 是 change mode 的缩写,用于修改文件或目录的权限。
Linux 权限模型
Linux 每个文件有三类权限:
每类权限有三个标志:
- 写(w):修改文件内容 / 在目录中创建/删除文件
权限的数字化表示:
用三个数字表示,如 755 = 所有者 rwx(7) + 所属组 r-x(5) + 其他用户 r-x(5)
基本用法
使用数字形式修改权限:
chmod 755 /path/to/file
使用符号形式修改权限:
chmod u+x /path/to/file # 给所有者添加执行权限chmod g-w /path/to/file # 从所属组移除写权限chmod o=r /path/to/file # 设置其他用户只有读权限chmod a+x /path/to/file # 给所有人添加执行权限
常用参数
常见权限值
实战示例
让脚本可执行:
chmod +x /usr/local/bin/myscript.sh
设置目录权限为 755(目录通常需要执行权限才能进入):
chmod 755 /var/www/html
设置文件权限为 644(普通配置文件):
chmod 644 /etc/nginx/nginx.conf
批量设置目录下所有文件为 644,目录为 755:
# 进入目录cd /var/www/html# 设置所有文件为 644find . -type f -exec chmod 644 {} \;# 设置所有目录为 755find . -type d -exec chmod 755 {} \;
更高效的方式:
# 755 for directories, 644 for filesfind /var/www/html -type d -exec chmod 755 {} \;find /var/www/html -type f -exec chmod 644 {} \;
安全权限设置
Web 应用常用权限方案:
# 网站根目录chown -R www-data:www-data /var/www/html# 只给 www-data 写权限chmod -R 755 /var/www/htmlchmod -R 775 /var/www/html/uploads # 上传目录需要可写
数据库文件权限(MySQL 为例):
chown -R mysql:mysql /var/lib/mysqlchmod -R 700 /var/lib/mysql # 只有 mysql 用户可访问
避坑指南
- 修改系统文件权限前,先备份原权限:
getfacl file > file.acl.bak - 目录需要执行权限才能访问内容,设置目录权限时要注意
- 使用
-R 参数时要格外小心,确保目录结构和文件类型符合预期 - 网站目录权限不要设置过于宽松,防止 webshell 上传后能执行
恢复误修改的权限
如果用 getfacl 备份过权限:
setfacl --restore=file.acl.bak
11. chown — 所有者修改
chown 是 change owner 的缩写,用于修改文件或目录的所有者和所属组。
基本用法
修改文件所有者:
chown user /path/to/file
修改文件所有者和所属组:
chown user:group /path/to/file
只修改所属组:
chown :group /path/to/file# 或chgrp group /path/to/file
常用参数
--reference=RFILE:参考另一个文件的owner和group
实战示例
修改目录所有者为 www-data:
chown -R www-data:www-data /var/www/html
修改文件所有者并保留所属组:
chown nginx /var/log/nginx/access.log
修改所属组(保留所有者):
chown :www-data /var/log/myapp.log
复制另一文件的权限设置:
chown --reference=/etc/passwd /etc/shadow
Web 应用典型权限设置
Nginx + PHP-FPM 场景:
# 假设 Nginx 以 www-data 用户运行,PHP-FPM 以 www-data 用户运行# 网站目录chown -R www-data:www-data /var/www/html# 上传目录(需要可写)chown -R www-data:www-data /var/www/html/uploads# 缓存目录chown -R www-data:www-data /var/www/html/cache
Nginx + PHP-FPM 不同用户场景(推荐生产使用):
# 假设 Nginx 以 nginx 用户运行,PHP-FPM 以 php-fpm 用户运行# 网站目录所有者设为 nginxchown -R nginx:nginx /var/www/html# 上传目录所有者设为 php-fpm,确保 PHP 可以写入chown -R php-fpm:php-fpm /var/www/html/uploads# 或者给两组用户都赋权(使用 ACL)setfacl -R -m u:nginx:rx /var/www/html/uploadssetfacl -R -m u:php-fpm:rw /var/www/html/uploads
数据库权限设置
MySQL 数据目录:
chown -R mysql:mysql /var/lib/mysqlchmod -R 700 /var/lib/mysql
PostgreSQL 数据目录:
chown -R postgres:postgres /var/lib/postgresqlchmod -R 700 /var/lib/postgresql
避坑指南
- 修改系统文件所有者前,确保知道后果,某些系统文件必须保持特定所有者才能正常工作
- 递归修改时,确保目录结构符合预期,可以用
find 先预览 - Web 应用文件所有者要与运行用户匹配,否则会出现无法读取或写入的问题
诊断权限问题
权限问题的典型表现:
- Web 应用无法读取文件:检查文件所有者是否与应用运行用户一致
- Web 应用无法写入文件:检查文件所有者是否有写权限
- 执行脚本报错 "Permission denied":检查脚本是否有执行权限
诊断命令:
# 查看文件详细信息ls -la /path/to/file# 查看目录详细内容ls -ld /path/to/directory# 查看文件 ACLgetfacl /path/to/file# 查看进程以哪个用户运行ps aux | grep nginxps aux | grep php-fpm
第四部分:磁盘与文件系统
磁盘空间管理是运维的基本功。df、du、mount 这三个命令用于查看磁盘使用情况和挂载存储设备。
12. df — 磁盘空间查看
df 是 disk free 的缩写,用于查看文件系统的磁盘空间使用情况。
基本用法
df
常用参数
实战示例
以人类可读格式查看磁盘空间:
df -h
输出示例:
Filesystem Size Used Avail Use% Mounted on/dev/sda1 100G 45G 55G 45% //dev/sdb1 500G 350G 150G 70% /datatmpfs 16G 2.0G 14G 13% /dev/shm/dev/sda2 50G 30G 20G 60% /var
解释每列:
查看所有文件系统包括伪文件系统:
df -ha
查看 inode 使用情况(适合排查小文件过多问题):
df -hi
输出示例:
Filesystem Inodes IUsed IFree IUse% Mounted on/dev/sda1 655360 82000 573360 13% //dev/sdb1 3276800 150000 3126800 5% /data
查看文件系统类型:
df -hT
输出示例:
Filesystem Type Size Used Avail Use% Mounted on/dev/sda1 ext4 100G 45G 55G 45% //dev/sdb1 xfs 500G 350G 150G 70% /datatmpfs tmpfs 16G 2.0G 14G 13% /dev/shm
磁盘空间告警判断
生产环境通常设置磁盘空间告警,常见阈值:
排查磁盘告警的步骤
df -h | grep -E "100%|9[0-9]%"
du -sh /data/*
常见清理场景
# 清理旧日志(保留最近 7 天)find /var/log -name "*.log" -mtime +7 -exec rm -f {} \;# 清理临时目录rm -rf /tmp/myapp_*# 清理缓存(需要确认哪些可以删)du -sh /var/cache/*
避坑指南
- df 显示的是文件系统层面的使用情况,即使文件被删除,如果进程还持有文件描述符,空间也不会释放
- ext4 文件系统保留 5% 空间给 root 用户,普通用户看到的使用率会更高
- tmpfs 文件系统使用内存作为存储,断电后数据丢失
磁盘空间不释放的排查
进程删除了文件但空间不释放:
# 找到持有已删除文件的进程lsof +L1
输出示例:
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NLINK NODE NAMEnginx 1234 www-data 4u REG 8,1 52428800 0 123456 /var/log/myapp.log (deleted)
处理方法:
- 重启进程:
systemctl restart nginx - 或者发送 HUP 信号让进程重新打开日志文件:
kill -HUP 1234
13. du — 目录大小查看
du 是 disk usage 的缩写,用于查看目录或文件的磁盘使用量。
基本用法
du /var/log
常用参数
--max-depth=N:显示到第 N 层目录(简写为 -d)
实战示例
查看当前目录总大小:
du -sh .
查看 /var/log 下每个目录的大小:
du -sh /var/log/*
按大小排序(需要结合 sort):
du -sh /var/log/* | sort -rh
查看当前目录下最大的 10 个文件或目录:
du -ah . | sort -rh | head -10
查看 /data 目录下占用空间最多的子目录(最多显示 1 层):
du -h --max-depth=1 /data
统计目录下日志文件总大小:
du -ch /var/log/myapp/*.log
输出最后一行的 total 就是总和。
实战:排查哪个目录占用最多空间
# 步骤1:查看根目录下各挂载点大小df -h# 步骤2:查看 /data 下最大的目录du -sh /data/*# 步骤3:进入占用最大的目录,继续排查du -sh /data/logs/*# 步骤4:找到具体的大文件du -ah /data/logs | sort -rh | head -20
批量查找大文件
# 查找 /var/log 下超过 100M 的文件find /var/log -type f -size +100M -exec ls -lh {} \;# 查找 /var/log 下超过 100M 的文件并排序find /var/log -type f -size +100M -exec ls -lh {} \; | sort -k5 -rh
避坑指南
- du 统计的是磁盘使用量,如果文件有硬链接会被重复计算
- du 默认不统计隐藏文件,需要加
-a 或明确指定 - du 统计目录时,会包含子目录,但不会重复计算子目录本身
- 统计大目录时 du 可能很慢,可以加
--apparent-size 参数跳过 inode 统计
性能优化
统计大目录时加速:
# 跳过某些不需要统计的目录du -sh /data --exclude='*.tmp'# 使用并行统计(如果系统有多个 CPU 核心)find /data -type d -print0 | xargs -0 -P 4 du -sh
14. mount — 挂载操作
mount 命令用于将存储设备或网络文件系统挂载到指定目录。
基本用法
挂载 ISO 文件:
mount -o loop /path/to/image.iso /mnt/iso
挂载 U 盘(假设 U 盘设备名为 /dev/sdb1):
mount /dev/sdb1 /mnt/usb
挂载 NFS 网络文件系统:
mount -t nfs 192.168.1.100:/data /mnt/nfs
常用参数
-t:指定文件系统类型,如 ext4、xfs、nfs、tmpfs、iso9660-o:指定挂载选项,如 ro(只读)、rw(读写)、noexec(不允许执行)、nosuid(忽略 suid)、defaults(使用默认选项)-a:挂载 /etc/fstab 中定义的所有文件系统-o remount:重新挂载(用于修改挂载选项,如把只读改为读写)
查看当前挂载情况
# 查看所有已挂载的文件系统mount# 查看 /etc/fstab 中定义的文件系统cat /etc/fstab# 查看磁盘 UUID(推荐用于 fstab 配置)blkid# 查看已挂载的文件系统(格式化输出)df -h
常用挂载场景
挂载 tmpfs(内存文件系统,适合存储临时数据):
mount -t tmpfs -o size=2G tmpfs /mnt/tmp
挂载 bind(将一个目录挂载到另一个位置):
mount --bind /data/app /var/www/html/data
只读挂载:
mount -o ro /dev/sdb1 /mnt/usb
重新挂载(修改已挂载文件系统的选项):
# 将 / 重新挂载为只读(进入单用户模式前常用)mount -o remount,ro /# 将 /data 重新挂载为读写mount -o remount,rw /data
开机自动挂载配置
在 /etc/fstab 中添加:
# 格式:<设备> <挂载点> <类型> <选项> <dump> <pass># UUID 获取方式:blkid /dev/sda1UUID=550e8400-e29b-41d4-a716-446655440000 /data ext4 defaults 0 2
测试 fstab 配置是否正确(不实际挂载):
mount -f /etc/fstab
卸载设备
# 普通卸载umount /mnt/usb# 强制卸载(设备忙时)umount -f /mnt/usb# 卸载所有已挂载的文件系统(谨慎使用)umount -a
避坑指南
- 修改 /etc/fstab 前务必备份,并使用
mount -f 测试 - 生产环境挂载网络文件系统(如 NFS)要考虑网络延迟和稳定性
- 挂载选项要符合安全要求,如 nosuid、noexec、ro 等
挂载相关故障排查
挂载失败常见原因:
第五部分:进程与资源
进程管理是运维的核心工作之一。ps、top、kill 这三个命令是进程管理的基础。
15. ps — 进程查看
ps 是 process status 的缩写,用于查看当前运行的进程状态。
基本用法
查看当前终端的进程:
ps
查看所有进程(完整格式):
ps aux
参数说明:
查看指定进程的 PID:
ps aux | grep nginx
常用参数组合
查看进程并按 CPU 使用率排序:
ps aux --sort=-%cpu | head -20
查看进程并按内存使用率排序:
ps aux --sort=-%mem | head -20
查看特定用户的进程:
ps -u www-data
查看特定进程(按名称):
ps aux | grep -E "nginx|php-fpm"
显示进程树(父子关系):
ps auxwf
或者:
pstree -ap
ps 输出字段说明
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMANDwww-data 1234 0.5 2.1 152340 8456 ? S May28 0:23 nginx: worker process
STAT 进程状态码
修饰符:
实战示例
查找 CPU 占用最高的进程:
ps aux --sort=-%cpu | head -10
查找内存占用最高的进程:
ps aux --sort=-%mem | head -10
查看某个用户运行的所有进程:
ps -u mysql
查看某个具体 PID 的进程:
ps -p 1234
或者:
ps -p $(pgrep -f nginx)
查看进程启动命令和参数:
ps -p 1234 -o args=
结合管道和 grep 查找进程
# 查找包含关键词的进程ps aux | grep "java"# 排除 grep 本身ps aux | grep "java" | grep -v grep# 精确匹配进程名ps aux | grep -E "^.*nginx.*$"
pgrep 命令
pgrep 是专门用于查找进程 ID 的命令,比 ps + grep 更简洁:
# 查找 nginx 进程的 PIDpgrep nginx# 查找并显示进程名pgrep -a nginx# 查找指定用户的进程pgrep -u www-data nginx
pkill 和 killall
根据进程名终止进程:
# 终止所有 nginx 进程pkill nginx# 强制终止(发送 SIGKILL)pkill -9 nginx# killall 根据进程名终止killall nginx
避坑指南
- ps aux 显示的 CPU 和内存百分比是瞬时值,不是平均值
- 杀死系统关键进程会导致服务中断,要确认进程用途后再操作
16. top 与 htop — 实时进程监控
top 是 Linux 下最常用的实时进程监控工具,可以动态显示系统资源使用情况和进程状态。
基本用法
top
top 交互命令
在 top 运行期间,可以按以下键进行交互:
top 常用选项
按 CPU 使用率排序,每 5 秒刷新一次:
top -b -d 5 -o %CPU | head -50
参数说明:
查看特定用户的进程:
top -u www-data
查看特定 PID 的进程:
top -p 1234
只显示前 20 个进程:
top -b -n 1 | head -27
top 输出字段
top - 14:30:25 up 45 days, 3:22, 1 user, load average: 0.52, 0.58, 0.59Tasks: 125 total, 1 running, 124 sleeping, 0 stopped, 0 zombie%Cpu(s): 5.3 us, 2.1 sy, 0.0 ni, 92.6 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 stMiB Mem : 31984.6 total, 8456.2 free, 18456.3 used, 5072.1 buff/cacheMiB Swap: 8192.0 total, 8192.0 free, 0.0 used. 12456.2 avail Mem PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 1234 www-data 20 0 152340 8456 2344 S 2.0 0.0 0:23.45 nginx 5678 mysql 20 0 1234560 456780 12344 S 1.5 1.4 12:34.56 mysqld
字段说明:
- load average:系统负载,1 分钟、5 分钟、15 分钟平均值
htop 介绍
htop 是 top 的增强版,界面更友好,操作更便捷(需要单独安装)。
# 安装 htopapt install htop # Debian/Ubuntuyum install htop # CentOS/RHEL# 启动 htophtop
htop 的优势:
实战:排查 CPU 过高
# 步骤1:运行 top 查看 CPU 使用情况top# 步骤2:按 P 排序,查看 CPU 占用最高的进程# 观察 %CPU 列# 步骤3:如果 nginx 进程 CPU 过高,查看其具体连接ps aux | grep nginx# 步骤4:查看 nginx 连接状态分布netstat -an | grep :80 | awk '/^tcp/ {print $6}' | sort | uniq -c# 步骤5:如果是 PHP-FPM CPU 高,查看慢请求tail -100 /var/log/php-fpm/slow.log
实战:排查内存过高
# 步骤1:运行 top 查看内存使用情况top# 步骤2:按 M 排序,查看内存占用最高的进程# 步骤3:检查是否有进程内存泄漏# 连续观察某个进程的 RES 值是否不断增长watch -n 5 'ps -p 1234 -o pid,%mem,rs'
避坑指南
- top 显示的是瞬时值,要观察一段时间才能判断是否存在持续问题
- load average 要结合 CPU 核心数判断,8 核 CPU 的 load 8 才是 100% 使用
- 内存使用率高不一定有问题,Linux 会尽可能利用内存做缓存
- 进程状态为 D(不可中断睡眠)通常是等待 I/O,此时 CPU 使用率可能很低
17. kill — 进程终止
kill 命令用于向进程发送信号,最常用的场景是终止进程。
基本用法
kill PID
这会发送 SIGTERM 信号(15),请求进程正常终止。
常用信号
强制终止进程
kill -9 PID
或者:
kill -SIGKILL PID
发送其他信号
让进程重新读取配置文件(以 Nginx 为例):
kill -HUP $(pgrep nginx)
暂停进程:
kill -STOP PID
恢复暂停的进程:
kill -CONT PID
批量终止进程
终止所有 nginx 进程:
killall nginx
或者:
pkill nginx
强制终止:
killall -9 nginx
查找并终止进程
查找某个端口对应的进程并终止:
# 方法1:使用 lsofkill -9 $(lsof -t -i:8080)# 方法2:使用 netstatkill -9 $(netstat -tlnp | grep :8080 | awk '{print $7}' | cut -d'/' -f1)# 方法3:使用 fuserkill -9 $(fuser -n tcp 8080 2>/dev/null)
优雅终止进程
生产环境建议按以下顺序终止进程:
# 优雅终止 Nginxkill -TERM $(pgrep nginx)# 等待 15 秒sleep 15# 检查进程是否还在ps aux | grep nginx# 如果还在,强制终止kill -9 $(pgrep nginx)
写一个终止脚本
#!/bin/bash# 终止指定名称的进程PROCESS_NAME=$1if [ -z "$PROCESS_NAME" ]; thenecho"用法: $0 <进程名>"exit 1fi# 查找进程 PIDPIDS=$(pgrep -f "$PROCESS_NAME")if [ -z "$PIDS" ]; thenecho"没有找到进程: $PROCESS_NAME"exit 0fiecho"找到进程: $PIDS"echo"发送 SIGTERM 信号..."# 发送 SIGTERMecho"$PIDS" | xargs kill# 等待 10 秒sleep 10# 检查是否还在REMAINING=$(pgrep -f "$PROCESS_NAME")if [ -n "$REMAINING" ]; thenecho"进程仍未退出,发送 SIGKILL..."echo"$REMAINING" | xargs kill -9fiecho"进程已终止"
避坑指南
- 绝对不能用 kill -9 终止 PostgreSQL、MySQL 等数据库的写进程,可能导致数据损坏
- 系统关键进程(如 init、sshd)不能随意终止
- 杀死父进程不会自动杀死子进程,子进程会变成孤儿进程被 init 收养
查看信号对进程的影响
每个进程对信号的处理方式不同,查看进程可用的信号:
# 查看进程 1234 能处理的信号kill -l 1234# 或查看所有信号列表kill -l
第六部分:网络诊断
网络问题是运维排查中最复杂的类型之一。ping、netstat/ss、curl 是最基础的网络诊断工具。
18. ping — 网络连通性
ping 是最基础的网络诊断工具,用于测试主机之间的连通性。
基本用法
ping 192.168.1.1
ping 域名:
ping www.baidu.com
常用参数
-f:快速 ping( flooding,显示每个请求,root 用户可用)
实战示例
ping 4 次后自动停止:
ping -c 4 192.168.1.1
每 2 秒 ping 一次:
ping -i 2 192.168.1.1
指定数据包大小(用于测试 MTU):
ping -s 1472 192.168.1.1
TTL 追踪(查看经过多少跳):
ping -t 64 192.168.1.1
ping 失败原因判断:
# "Destination Host Unreachable" - 路由问题或目标主机不存在# "Destination Port Unreachable" - 目标主机存在但协议不匹配# "Request timeout" - 防火墙阻止或目标主机不响应# "From 192.168.1.254: time exceeded" - 路由环路或 TTL 为 0
MTU 问题排查
MTU(Maximum Transmission Unit)最大传输单元,默认是 1500 字节。如果网络路径中有更小的 MTU,ping 大数据包会失败。
测试路径最大 MTU:
# 正常 MTU(1500)应该成功ping -s 1472 -c 1 8.8.8.8# 如果失败,逐步减小数据包大小ping -s 1400 -c 1 8.8.8.8ping -s 1300 -c 1 8.8.8.8
网络延迟分析
ping 输出示例:
64 bytes from 8.8.8.8: icmp_seq=1 ttl=117 time=15.4 ms
分析延迟:
脚本检测网络连通性
#!/bin/bash# 检测网络连通性HOSTS=("8.8.8.8""114.114.114.114""www.baidu.com")FAILED=0for HOST in"${HOSTS[@]}"; doif ping -c 1 -W 3 "$HOST" > /dev/null 2>&1; thenecho"[OK] $HOST 可达"elseecho"[FAIL] $HOST 不可达" FAILED=$((FAILED+1))fidoneif [ $FAILED -gt 0 ]; thenecho"网络检测失败: $FAILED 个主机不可达"exit 1elseecho"网络检测正常"exit 0fi
避坑指南
- ping 通不代表网络完全正常,ping 只测试 ICMP 协议,TCP/UDP 可能被防火墙拦截
- 有些服务器禁用 ICMP ping,不通不代表网络不通
- ping 结果受网络拥塞、路由跳数等多因素影响,要综合判断
- 快速 ping(ping -f)会发送大量数据包,可能影响网络性能,谨慎使用
19. netstat 与 ss — 端口与连接
netstat 和 ss 都用于查看网络连接、路由表、接口统计等信息。ss 是 netstat 的现代替代品,速度更快。
netstat 基本用法
查看所有连接:
netstat -an
参数说明:
ss 基本用法
ss -tan state established
参数说明:
常用连接状态
实战示例
查看所有监听端口:
# netstat 方式netstat -tlnp# ss 方式(更快)ss -tlnp
输出示例:
State Recv-Q Send-Q Local Address:Port Peer Address:Port ProcessLISTEN 0 128 0.0.0.0:22 0.0.0.0:* users:(("sshd",pid=1234,fd=3))LISTEN 0 511 0.0.0.0:80 0.0.0.0:* users:(("nginx",pid=5678,fd=6))
查看所有已建立的连接:
ss -tan state established
查看连接特定端口的进程:
# 查看 80 端口的连接ss -tlnp | grep :80# 查看连接到本机 80 端口的所有 IPss -tnp | grep ':80'
查看连接数统计:
# 统计各状态的连接数ss -tan | awk '{print $1}' | sort | uniq -c# 统计每个 IP 的连接数ss -tan | awk '/ESTAB/ {print $5}' | cut -d: -f1 | sort | uniq -c | sort -rn | head -20
查看 TCP 连接超时时间:
ss -tan state time-wait
查看端口被哪个进程占用:
# 方法1:使用 netstatnetstat -tlnp | grep :8080# 方法2:使用 ssss -tlnp | grep :8080# 方法3:使用 lsoflsof -i :8080# 方法4:使用 fuserfuser 8080/tcp
连接数过多问题排查
# 步骤1:查看当前连接数ss -s# 步骤2:查看 TIME_WAIT 连接数ss -tan state time-wait | wc -l# 步骤3:查看 CLOSE_WAIT 连接数ss -tan state close-wait | wc -l# 步骤4:找出连接数最多的 IPss -tan | awk '/ESTAB/ {print $5}' | cut -d: -f1 | sort | uniq -c | sort -rn | head -20
优化 TIME_WAIT
Linux 内核参数调整:
# 启用快速回收 TIME_WAITsysctl -w net.ipv4.tcp_tw_reuse=1# 设置 TIME_WAIT 超时时间(默认 60 秒)sysctl -w net.ipv4.tcp_fin_timeout=30# 启用 TCP 快速打开sysctl -w net.ipv4.tcp_fastopen=3
查看当前值:
sysctl net.ipv4.tcp_tw_reusesysctl net.ipv4.tcp_fin_timeout
永久生效需要写入 /etc/sysctl.conf:
echo"net.ipv4.tcp_tw_reuse = 1" >> /etc/sysctl.confecho"net.ipv4.tcp_fin_timeout = 30" >> /etc/sysctl.confsysctl -p
避坑指南
- netstat -an 会解析域名,速度慢。大服务器上建议用 ss
- TIME_WAIT 是正常状态,不要看到 TIME_WAIT 就认为是问题
- 连接数突然暴增可能是被攻击或爬虫,需要结合业务判断
20. curl — HTTP 请求
curl 是强大的 HTTP 客户端工具,用于发送各种 HTTP 请求、测试接口、下载文件等。
基本用法
发送 GET 请求:
curl https://www.example.com
发送 POST 请求:
curl -X POST https://api.example.com/data
常用参数
-X:指定 HTTP 方法(GET、POST、PUT、DELETE 等)
实战示例
发送 JSON 数据的 POST 请求:
curl -X POST https://api.example.com/users \ -H "Content-Type: application/json" \ -d '{"name":"test","email":"test@example.com"}'
带认证的请求:
# Basic Authcurl -u username:password https://api.example.com/profile# Bearer Tokencurl -H "Authorization: Bearer TOKEN" https://api.example.com/profile
下载文件:
# 下载并保存为 original_filenamecurl -O https://example.com/file.zip# 下载并保存为指定文件名curl -o myfile.zip https://example.com/file.zip
查看响应头:
curl -I https://www.example.com
跟随重定向并查看最终响应:
curl -L -I https://short.url/abc
自定义 User-Agent:
curl -A "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36" https://www.example.com
自定义输出格式:
# 显示 HTTP 状态码curl -w "%{http_code}" -s -o /dev/null https://www.example.com# 显示完整信息curl -w "HTTP Code: %{http_code}\nTotal Time: %{time_total}s\n" -s -o /dev/null https://www.example.com
检测网站可用性脚本:
#!/bin/bashURL=$1EXPECTED_CODE=${2:-200}HTTP_CODE=$(curl -o /dev/null -s -w "%{http_code}" -L "$URL")if [ "$HTTP_CODE" = "$EXPECTED_CODE" ]; thenecho"[OK] $URL 返回 $HTTP_CODE"exit 0elseecho"[FAIL] $URL 返回 $HTTP_CODE,期望 $EXPECTED_CODE"exit 1fi
测试 API 响应时间:
curl -w "\nDNS: %{time_namelookup}s\nConnect: %{time_connect}s\nSSL: %{time_appconnect}s\nTotal: %{time_total}s\n" \ -o /dev/null -s https://www.example.com
测试多个接口:
#!/bin/bash# 健康检查脚本ENDPOINTS=("https://api.example.com/health""https://api.example.com/status""https://api.example.com/ping")ALL_OK=truefor endpoint in"${ENDPOINTS[@]}"; do HTTP_CODE=$(curl -o /dev/null -s -w "%{http_code}" -L "$endpoint")if [ "$HTTP_CODE" = "200" ] || [ "$HTTP_CODE" = "204" ]; thenecho"[OK] $endpoint -> $HTTP_CODE"elseecho"[FAIL] $endpoint -> $HTTP_CODE" ALL_OK=falsefidoneif [ "$ALL_OK" = true ]; thenecho"所有接口正常"exit 0elseecho"部分接口异常"exit 1fi
与 JSON 处理结合
使用 curl 获取 JSON 并用 jq 解析(需要安装 jq):
# 安装 jqapt install jq# 获取 JSON 并解析curl -s https://api.example.com/users | jq '.data[] | {name, email}'
调试 HTTPS 问题
查看完整的 SSL 握手信息:
curl -vvv https://www.example.com 2>&1 | grep -E "(SSL|TLS|Certificate|Subject|Issuer)"
不验证 SSL 证书(仅测试用):
curl -k https://self-signed.cert.example.com
查看 SSL 证书信息:
curl -Iv https://www.example.com 2>&1 | grep -E "(SSL|TLS|subject|issuer|notBefore|notAfter)"
上传文件
# 单文件上传curl -X POST -F "file=@/path/to/file.txt" https://api.example.com/upload# 多文件上传curl -X POST -F "file1=@file1.txt" -F "file2=@file2.txt" https://api.example.com/upload
模拟 form 表单提交
# application/x-www-form-urlencodedcurl -X POST -d "username=admin&password=123456" https://api.example.com/login# multipart/form-datacurl -X POST -F "username=admin" -F "password=123456" https://api.example.com/login
避坑指南
- curl 默认不跟随重定向,如果测试 Web 应用需要加
-L - curl 默认输出到标准输出,如果下载大文件需要用
-o 或 -O - 使用
-k 参数会跳过 SSL 验证,生产环境要谨慎 - curl 默认使用 GET 方法,POST 数据要加
-d 参数 - shell 脚本中使用 curl 最好加
-s 静默进度条,避免干扰输出
实战案例
案例一:排查日志文件问题
场景描述
凌晨 2 点收到告警,/var/log 目录使用率超过 85%。需要快速定位问题并处理。
排查步骤
du -sh /var/log/*
- 发现 /var/log/myapp 目录占用了 80G
du -sh /var/log/myapp/*
- 进一步定位,发现 /var/log/myapp/access.log 占了 60G
du -ah /var/log/myapp | sort -rh | head -10
tail -20 /var/log/myapp/access.log
cat /etc/logrotate.d/myapp
输出示例:
/var/log/myapp/*.log { daily rotate 7 compress delaycompress missingok notifempty create 0644 www-data www-data postrotatekill -USR1 $(cat /var/run/myapp.pid 2>/dev/null) endscript}
分析问题:日志轮转配置了,但可能日志量太大,超过轮转周期
# 先备份cp /var/log/myapp/access.log /var/log/myapp/access.log.bak.$(date +%Y%m%d)# 清空原文件(而不是删除,因为进程还在写入)> /var/log/myapp/access.log# 或者用 truncatetruncate -s 0 /var/log/myapp/access.log# 通知进程重新打开日志文件kill -USR1 $(pgrep myapp)
ls -lh /var/log/myapp/df -h /var/log
编辑 /etc/logrotate.d/myapp,增加轮转频率或保留份数:
/var/log/myapp/*.log { hourly # 从 daily 改为 hourly rotate 24 # 保留 24 份,按 hourly 算就是 24 小时 ...}
总结
- 定期检查 /var/log 目录大小,建立告警机制
- 清理日志时不要用 rm,而是用 > 或 truncate 清空内容后通知进程重新打开
案例二:批量清理过期文件
场景描述
/data/cache 目录积累了 3 年的缓存文件,占用 500G 空间。需要清理 180 天前的文件。
操作步骤
find /data/cache -type f -mtime +180 -print | head -100
find /data/cache -type f -mtime +180 | wc -l
find /data/cache -type f -mtime +180 -exec du -ch {} + | tail -1
- 确认无误后,分批删除(避免一次删除过多文件造成 I/O 负载)
# 分批删除,每批 1000 个文件find /data/cache -type f -mtime +180 -print0 | xargs -0 -n 1000 rm -f
find /data/cache -type d -empty -delete
df -h /datadu -sh /data/cache/*
安全建议
- 用 -print0 配合 xargs -0 处理文件名包含空格的情况
- 不要用 rm -rf 配合 find -mtime,避免误删
#!/bin/bash# 安全清理脚本DIR="/data/cache"DAYS=180BATCH_SIZE=1000LOGFILE="/var/log/cleanup_$(date +%Y%m%d).log"echo"$(date) 开始清理 $DIR 目录下 ${DAYS} 天前的文件" | tee -a "$LOGFILE"# 统计文件数量FILE_COUNT=$(find "$DIR" -type f -mtime +$DAYS | wc -l)echo"待删除文件数量: $FILE_COUNT" | tee -a "$LOGFILE"# 统计文件大小TOTAL_SIZE=$(find "$DIR" -type f -mtime +$DAYS -exec du -ch {} + | tail -1 | cut -f1)echo"待删除文件总大小: $TOTAL_SIZE" | tee -a "$LOGFILE"# 确认操作read -p "确认删除? (yes/no): " CONFIRMif [ "$CONFIRM" != "yes" ]; thenecho"取消操作"exit 0fi# 分批删除find "$DIR" -type f -mtime +$DAYS -print0 | xargs -0 -n $BATCH_SIZE rm -f# 删除空目录find "$DIR" -type d -empty -deleteecho"$(date) 清理完成" | tee -a "$LOGFILE"
案例三:分析服务器磁盘告警
场景描述
收到告警:服务器 /data 分区使用率超过 90%。需要分析原因并处理。
排查步骤
df -h /data
输出:
Filesystem Size Used Avail Use% Mounted on/dev/sdb1 1000G 950G 50G 95% /data
du -h --max-depth=1 /data
输出:
700G /data/logs200G /data/uploads 50G /data/db_backup
du -h --max-depth=1 /data/logs
输出:
500G /data/logs/myapp200G /data/logs/nginx
du -h --max-depth=1 /data/logs/myapp
发现 /data/logs/myapp/2024 目录占用了 400G。
ls -lht /data/logs/myapp/2024 | head -20
# 查看目录中文件数量ls /data/logs/myapp/2024 | wc -l# 查看每天新增多少文件ls /data/logs/myapp/2024 | tail -30 | wc -l
cat /etc/logrotate.d/myapp
根据分析结果:
- /data/logs/myapp/2024 是 2024 年的旧日志,已归档但未清理
# 备份重要日志mkdir -p /backup/logs_2024mv /data/logs/myapp/2024/*.gz /backup/logs_2024/ 2>/dev/nullmv /data/logs/myapp/2024/*.log /backup/logs_2024/ 2>/dev/null# 删除 2024 目录中的其他文件(保留压缩包)find /data/logs/myapp/2024 -type f ! -name "*.gz" -mtime +365 -delete# 清理 30 天前的普通日志find /data/logs/myapp -type f -name "*.log" -mtime +30 -delete# 压缩 7 天前的日志find /data/logs/myapp -type f -name "*.log" -mtime +7 ! -name "*.gz" -exec gzip {} \;
df -h /datadu -sh /data/logs/*
创建 /etc/cron.daily/cleanup-myapp-logs:
#!/bin/bash# 清理 30 天前的日志,压缩 7 天前的日志LOG_DIR="/data/logs/myapp"DAYS_DELETE=30DAYS_COMPRESS=7# 压缩 7 天前的日志find "$LOG_DIR" -type f -name "*.log" -mtime +$DAYS_COMPRESS ! -name "*.gz" -exec gzip {} \;# 删除 30 天前的日志find "$LOG_DIR" -type f -name "*.log.gz" -mtime +$DAYS_DELETE -delete# 删除空目录find "$LOG_DIR" -type d -empty -delete
chmod +x /etc/cron.daily/cleanup-myapp-logs
总结
磁盘告警排查的闭环流程:
- 分析原因:查看文件时间戳、日志轮转配置、业务日志产生速度
- 预防措施:配置日志轮转、定期清理任务、告警阈值调整
总结:20个命令速查表
学习建议
- 遇到问题先查 man 手册:
man command