新手必会: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:以长格式显示,包含文件类型、权限、链接数、所有者、所属组、大小、修改时间
-a:显示所有文件,包括以点开头的隐藏文件
-h:配合 -l 使用,以人类可读的方式显示文件大小(K、M、G)
-t:按修改时间排序,最新修改的文件排在前面
-r:反向排序
-R:递归显示子目录内容
实战示例
查看当前目录下所有文件的详细信息,包括隐藏文件:
ls -lha
输出示例:
total 28 drwxr-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 .profile drwxr-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/bash cd/var/log/myapp ls -la *.log
注意:cd 命令如果失败,后续命令会在错误的目录下执行。在脚本中应该加上判断:
#!/bin/bash if!cd/var/log/myapp 2>/dev/null;then echo"目录不存在或无法访问" exit1 fi ls -la *.log
绝对路径与相对路径
绝对路径以 / 开头,从根目录开始定位:
cd/var/log/nginx
相对路径从当前目录开始定位:
# 当前在 /var cdlog/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
常用参数
-r或-R:递归复制整个目录
-p:保留文件的权限、时间戳等属性
-i:交互式复制,如果目标文件存在会提示确认
-v:显示复制过程的详细信息
-f:强制覆盖已存在的目标文件
-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)
避坑指南
复制目录必须加-r参数,否则会报错
默认情况下 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
常用参数
-i:交互式移动,目标文件存在时提示确认
-v:显示移动过程的详细信息
-f:强制移动,不做任何确认
-n:不覆盖已存在的目标文件
-u:只移动源文件比目标文件新或目标文件不存在的情况
实战示例
按日期归档日志文件:
mv /var/log/myapp.log /var/log/archive/myapp_$(date +%Y%m%d).log
批量重命名:将目录下所有 .txt 文件改为 .log:
# 方法一:使用 rename 命令(如果系统有安装)
rename's/.txt$/.log/'*.txt
# 方法二:使用循环
forfin*.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
常用参数
-r或-R:递归删除整个目录
-f:强制删除,不做任何确认(即使文件是只读的)
-i:交互式删除,每个文件都提示确认
-v:显示删除过程的详细信息
实战示例
删除目录下所有 .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 ~/*
安全建议
删除前先确认当前位置和文件名:pwd和ls
删除重要文件前先备份
使用-i参数开启确认提示,尤其是在 shell 脚本中
生产环境执行删除操作前,先用ls预览要删除的文件
设置别名保护:alias rm='rm -i',但注意这在 root 用户下可能被-f参数覆盖
查看危险别名
# 查看 rm 是否被别名保护 aliasrm # 如果输出是 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 <
常用参数
-n:显示行号
-b:显示行号,但空行不编号
-s:将连续多个空行压缩为一个空行
-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
常用参数
-i:忽略大小写
-v:反向选择,显示不包含匹配模式的行
-n:显示匹配行的行号
-r或-R:递归搜索目录
-c:只显示匹配的行数
-l:只显示包含匹配模式的文件名
-L:显示不包含匹配模式的文件名
-A n:显示匹配行及其后面的 n 行
-B n:显示匹配行及其前面的 n 行
-e:指定多个匹配模式
-w:整词匹配
-E:使用扩展正则表达式
实战示例
搜索错误日志:
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/Ubuntu yum install ripgrep # CentOS/RHEL # 使用 ripgrep rg"error"/var/log/myapp.log
避坑指南
grep 默认使用基本正则表达式,一些特殊字符需要转义。如果使用扩展正则表达式,加-E参数
搜索的字符串如果包含特殊字符(如 $、*、?),需要转义或加引号
grep 默认区分大小写,使用-i忽略大小写
如果搜索目录,grep 默认只搜索普通文件,不会跟随符号链接。使用-R可以跟随符号链接
8. head 与 tail — 文件头部和尾部查看
head 用于查看文件开头部分,tail 用于查看文件结尾部分。这两个命令在日志分析中非常有用。
head 基本用法
head /var/log/myapp.log
默认显示前 10 行。
head 常用参数
-n:指定显示的行数
-c:指定显示的字节数
-q:多个文件时不显示文件名
tail 基本用法
tail /var/log/myapp.log
默认显示最后 10 行。
tail 常用参数
-n:指定显示的行数
-c:指定显示的字节数
-f:实时监控文件追加内容(Ctrl+C 退出)
-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 60 after=$(wc -l < /var/log/myapp.log) echo "每分钟增长: $((after - before)) 行"
查找特定时间段的日志
# 查看 2026-05-29 10点到11点之间的日志 # 假设日志格式是 [2026-05-29 1000] 这种格式 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
输出格式:行数 单词数 字节数 文件名
常用参数
-l:只统计行数
-w:只统计单词数
-c:只统计字节数
-m:只统计字符数
-L:显示文件中最长一行的长度
实战示例
统计日志文件总行数:
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 按空格和换行符分割,中文文本统计不准确
统计大文件时要等待一下,磁盘 I/O 可能较慢
第三部分:权限与所有者
Linux 的权限模型是运维工程师必须掌握的核心概念。chmod 和 chown 是最常用的权限管理命令。
10. chmod — 权限修改
chmod 是 change mode 的缩写,用于修改文件或目录的权限。
Linux 权限模型
Linux 每个文件有三类权限:
所有者权限(user):文件所属用户的权限
所属组权限(group):文件所属组的成员的权限
其他用户权限(others):其他所有用户的权限
每类权限有三个标志:
读(r):查看文件内容 / 列出目录内容
写(w):修改文件内容 / 在目录中创建/删除文件
执行(x):执行文件 / 进入目录
权限的数字化表示:
r = 4
w = 2
x = 1
用三个数字表示,如 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 # 给所有人添加执行权限
常用参数
-R:递归修改目录及其内容的权限
-v:显示每个文件的权限变更详情
-c:只在权限发生变化时报告
-f:不显示错误信息
常见权限值
权限值 含义 用途 777 rwxrwxrwx 所有人可读可写可执行(危险) 755 rwxr-xr-x 所有者可读写执行,组和其他人可读执行 644 rw-r--r-- 所有者可读写,组和其他人只读 600 rw------- 只有所有者可读写 500 r-x------ 所有者可读执行 400 r-------- 只有所有者可读 实战示例
让脚本可执行:
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 # 设置所有文件为 644 find . -typef -execchmod 644 {} ; # 设置所有目录为 755 find . -typed -execchmod 755 {} ;
更高效的方式:
# 755 for directories, 644 for files find /var/www/html -typed -execchmod 755 {} ; find /var/www/html -typef -execchmod 644 {} ;
安全权限设置
Web 应用常用权限方案:
# 网站根目录 chown -R www-data:www-data /var/www/html # 只给 www-data 写权限 chmod -R 755 /var/www/html chmod -R 775 /var/www/html/uploads # 上传目录需要可写
数据库文件权限(MySQL 为例):
chown -R mysql:mysql /var/lib/mysql chmod -R 700 /var/lib/mysql # 只有 mysql 用户可访问
避坑指南
不要设置 777 权限,这是严重的安全漏洞
修改系统文件权限前,先备份原权限: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
常用参数
-R:递归修改目录及其内容的所有者和所属组
-v:显示每个文件的变更详情
-c:只在发生变化时报告
--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 用户运行 # 网站目录所有者设为 nginx chown -R nginx:nginx /var/www/html # 上传目录所有者设为 php-fpm,确保 PHP 可以写入 chown -R php-fpm:php-fpm /var/www/html/uploads # 或者给两组用户都赋权(使用 ACL) setfacl -R -m urx /var/www/html/uploads setfacl -R -m urw /var/www/html/uploads
数据库权限设置
MySQL 数据目录:
chown -R mysql:mysql /var/lib/mysql chmod -R 700 /var/lib/mysql
PostgreSQL 数据目录:
chown -R postgres:postgres /var/lib/postgresql chmod -R 700 /var/lib/postgresql
避坑指南
修改系统文件所有者前,确保知道后果,某些系统文件必须保持特定所有者才能正常工作
递归修改时,确保目录结构符合预期,可以用find先预览
不要把文件所有者改成不存在的用户
Web 应用文件所有者要与运行用户匹配,否则会出现无法读取或写入的问题
诊断权限问题
权限问题的典型表现:
Web 应用无法读取文件:检查文件所有者是否与应用运行用户一致
Web 应用无法写入文件:检查文件所有者是否有写权限
执行脚本报错 "Permission denied":检查脚本是否有执行权限
诊断命令:
# 查看文件详细信息 ls -la /path/to/file # 查看目录详细内容 ls -ld /path/to/directory # 查看文件 ACL getfacl /path/to/file # 查看进程以哪个用户运行 ps aux | grep nginx ps aux | grep php-fpm
第四部分:磁盘与文件系统
磁盘空间管理是运维的基本功。df、du、mount 这三个命令用于查看磁盘使用情况和挂载存储设备。
12. df — 磁盘空间查看
df 是 disk free 的缩写,用于查看文件系统的磁盘空间使用情况。
基本用法
df
常用参数
-h:人类可读格式(K、M、G)
-T:显示文件系统类型
-i:显示 inode 信息(而不是磁盘块)
-a:显示所有文件系统,包括虚拟文件系统
-l:只显示本地文件系统
-BG:以 1G 为单位显示
-BM:以 1M 为单位显示
实战示例
以人类可读格式查看磁盘空间:
df -h
输出示例:
Filesystem Size Used Avail Use% Mounted on /dev/sda1 100G 45G 55G 45% / /dev/sdb1 500G 350G 150G 70% /data tmpfs 16G 2.0G 14G 13% /dev/shm /dev/sda2 50G 30G 20G 60% /var
解释每列:
Filesystem:文件系统设备名或 UUID
Size:文件系统总大小
Used:已使用空间
Avail:可用空间
Use%:使用百分比
Mounted on:挂载点
查看所有文件系统包括伪文件系统:
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% /data tmpfs tmpfs 16G 2.0G 14G 13% /dev/shm
磁盘空间告警判断
生产环境通常设置磁盘空间告警,常见阈值:
分区 告警阈值 说明 / 85% 根分区满会导致系统异常 /var 85% 日志、缓存可能撑满 /data 90% 数据分区允许较高使用率 /tmp 90% 临时文件分区 排查磁盘告警的步骤
查看是哪个分区满了
df -h | grep -E"100%|9[0-9]%"
查看该挂载点下哪些目录占用最多空间
du -sh /data/*
确认是日志、缓存、数据还是临时文件
制定清理或扩容方案
常见清理场景
# 清理旧日志(保留最近 7 天) find /var/log-name"*.log"-mtime +7 -execrm -f {} ; # 清理临时目录 rm -rf /tmp/myapp_* # 清理缓存(需要确认哪些可以删) du -sh /var/cache/*
避坑指南
df 显示的是文件系统层面的使用情况,即使文件被删除,如果进程还持有文件描述符,空间也不会释放
ext4 文件系统保留 5% 空间给 root 用户,普通用户看到的使用率会更高
tmpfs 文件系统使用内存作为存储,断电后数据丢失
NFS 等网络文件系统显示的使用情况可能不准确
磁盘空间不释放的排查
进程删除了文件但空间不释放:
# 找到持有已删除文件的进程 lsof +L1
输出示例:
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NLINK NODE NAME nginx 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
常用参数
-h:人类可读格式
-s:显示总计,不显示每个子目录
-a:显示所有文件,而不只是目录
-d N:显示到第 N 层目录
--max-depth=N:显示到第 N 层目录(简写为 -d)
-c:显示总计
-BM:以 1M 为单位显示
实战示例
查看当前目录总大小:
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-typef -size +100M -execls -lh {} ; # 查找 /var/log 下超过 100M 的文件并排序 find /var/log-typef -size +100M -execls -lh {} ; | sort -k5 -rh
避坑指南
du 统计的是磁盘使用量,如果文件有硬链接会被重复计算
du 默认不统计隐藏文件,需要加-a或明确指定
du 统计目录时,会包含子目录,但不会重复计算子目录本身
统计大目录时 du 可能很慢,可以加--apparent-size参数跳过 inode 统计
性能优化
统计大目录时加速:
# 跳过某些不需要统计的目录 du -sh /data --exclude='*.tmp' # 使用并行统计(如果系统有多个 CPU 核心) find /data -typed -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 中定义的所有文件系统
-l:列出所有已挂载的文件系统(带标签)
-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 中添加:
# 格式:<设备> <挂载点> <类型> <选项># UUID 获取方式:blkid /dev/sda1 UUID=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 等
挂载相关故障排查
挂载失败常见原因:
挂载点不存在 → 创建目录
设备不存在 → 检查设备名是否正确
设备正在使用 → 先关闭相关进程
文件系统损坏 → 使用 fsck 修复
权限问题 → 检查目标目录权限
第五部分:进程与资源
进程管理是运维的核心工作之一。ps、top、kill 这三个命令是进程管理的基础。
15. ps — 进程查看
ps 是 process status 的缩写,用于查看当前运行的进程状态。
基本用法
查看当前终端的进程:
ps
查看所有进程(完整格式):
ps aux
参数说明:
a:显示所有终端的进程
u:显示进程详细信息(用户、CPU、内存等)
x:显示没有控制终端的进程(守护进程)
查看指定进程的 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 COMMAND www-data 1234 0.5 2.1 152340 8456 ? S May28 0:23 nginx: worker process
USER:进程所属用户
PID:进程 ID
%CPU:CPU 使用百分比
%MEM:内存使用百分比
VSZ:虚拟内存大小(KB)
RSS:物理内存大小(KB)
TTY:关联的终端,? 表示没有终端
STAT:进程状态
START:进程启动时间
TIME:累计 CPU 时间
COMMAND:进程命令
STAT 进程状态码
状态码 含义 R 运行中或可运行 S 可中断的睡眠 D 不可中断的睡眠(通常是 I/O 等待) Z 僵尸进程 T 暂停或跟踪 X 死亡进程(不显示) 修饰符:
<:高优先级
N:低优先级
L:锁定在内存中
s:会话领导进程
l:多线程进程
+:前台进程组
实战示例
查找 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 进程的 PID pgrep 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 运行期间,可以按以下键进行交互:
q:退出 top
P:按 CPU 使用率排序
M:按内存使用率排序
T:按累计时间排序
k:终止一个进程(会提示输入 PID 和信号)
r:修改进程优先级(renice)
u:查看指定用户的进程
n:修改显示的进程数量
c:显示完整命令路径
l:显示/隐藏第一行负载信息
m:显示/隐藏内存信息
f:选择显示字段
W:保存当前配置到 ~/.toprc
top 常用选项
按 CPU 使用率排序,每 5 秒刷新一次:
top -b -d 5 -o %CPU | head -50
参数说明:
-b:批处理模式,适合输出到文件
-d:刷新间隔(秒)
-o:排序字段
查看特定用户的进程:
top -u www-data
查看特定 PID 的进程:
top -p 1234
只显示前 20 个进程:
top -b -n 1 | head -27
top 输出字段
top - 1425 up 45 days, 3:22, 1 user, load average: 0.52, 0.58, 0.59 Tasks: 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 st MiB Mem : 31984.6 total, 8456.2 free, 18456.3 used, 5072.1 buff/cache MiB 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 分钟平均值
us:用户空间 CPU 使用率
sy:内核空间 CPU 使用率
id:空闲 CPU 百分比
wa:I/O 等待 CPU 百分比
PR:优先级
NI:nice 值
VIRT:虚拟内存大小
RES:物理内存大小(常驻内存)
SHR:共享内存大小
TIME+:累计 CPU 时间
htop 介绍
htop 是 top 的增强版,界面更友好,操作更便捷(需要单独安装)。
# 安装 htop apt install htop # Debian/Ubuntu yum install htop # CentOS/RHEL # 启动 htop htop
htop 的优势:
界面更直观,颜色区分进程状态
支持鼠标操作
支持树形显示进程关系
可以垂直或水平滚动查看更多列
支持快捷键 F1-F10
实战:排查 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 命令用于向进程发送信号,最常用的场景是终止进程。
基本用法
killPID
这会发送 SIGTERM 信号(15),请求进程正常终止。
常用信号
信号 编号 说明 用途 SIGTERM 15 终止信号 正常终止进程,进程可以捕获并清理后退出 SIGKILL 9 强制终止 强制杀死进程,无法捕获,进程立即退出 SIGHUP 1 挂起信号 通常用于让进程重新读取配置文件 SIGINT 2 中断信号 Ctrl+C 发送的信号 SIGQUIT 3 退出信号 生成 core dump 强制终止进程
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:使用 lsof kill-9 $(lsof -t -i:8080) # 方法2:使用 netstat kill-9 $(netstat -tlnp | grep :8080 | awk'{print $7}'| cut -d'/'-f1) # 方法3:使用 fuser kill-9 $(fuser -n tcp 8080 2>/dev/null)
优雅终止进程
生产环境建议按以下顺序终止进程:
先发送 SIGTERM,让进程有时间清理
等待一段时间(通常 10-30 秒)
如果进程仍未退出,发送 SIGKILL
# 优雅终止 Nginx kill-TERM $(pgrep nginx) # 等待 15 秒 sleep 15 # 检查进程是否还在 ps aux | grep nginx # 如果还在,强制终止 kill-9 $(pgrep nginx)
写一个终止脚本
#!/bin/bash # 终止指定名称的进程 PROCESS_NAME=$1 if[ -z"$PROCESS_NAME"];then echo"用法:$0<进程名>" exit1 fi # 查找进程 PID PIDS=$(pgrep -f"$PROCESS_NAME") if[ -z"$PIDS"];then echo"没有找到进程:$PROCESS_NAME" exit0 fi echo"找到进程:$PIDS" echo"发送 SIGTERM 信号..." # 发送 SIGTERM echo"$PIDS"| xargskill # 等待 10 秒 sleep 10 # 检查是否还在 REMAINING=$(pgrep -f"$PROCESS_NAME") if[ -n"$REMAINING"];then echo"进程仍未退出,发送 SIGKILL..." echo"$REMAINING"| xargskill-9 fi echo"进程已终止"
避坑指南
绝对不能用 kill -9 终止 PostgreSQL、MySQL 等数据库的写进程,可能导致数据损坏
终止进程前,确认进程是否在处理重要任务
系统关键进程(如 init、sshd)不能随意终止
杀死父进程不会自动杀死子进程,子进程会变成孤儿进程被 init 收养
容器内的 kill 行为可能与宿主机不同,要注意
查看信号对进程的影响
每个进程对信号的处理方式不同,查看进程可用的信号:
# 查看进程 1234 能处理的信号 kill-l 1234 # 或查看所有信号列表 kill-l
第六部分:网络诊断
网络问题是运维排查中最复杂的类型之一。ping、netstat/ss、curl 是最基础的网络诊断工具。
18. ping — 网络连通性
ping 是最基础的网络诊断工具,用于测试主机之间的连通性。
基本用法
ping 192.168.1.1
ping 域名:
ping www.baidu.com
常用参数
-c:指定 ping 的次数
-i:指定 ping 的间隔(秒)
-t:指定 TTL 值
-s:指定数据包大小
-f:快速 ping( flooding,显示每个请求,root 用户可用)
-w:指定超时时间(秒)
-W:指定等待响应时间(秒)
实战示例
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.8 ping -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
64 bytes:数据包大小
8.8.8.8:目标 IP
icmp_seq=1:ICMP 序列号
ttl=117:生存时间(每经过一个路由减 1)
time=15.4 ms:往返延迟
分析延迟:
< 50ms:网络状况良好
50-100ms:有一定延迟
100ms:延迟严重
抖动大(延迟忽高忽低):网络不稳定
脚本检测网络连通性
#!/bin/bash # 检测网络连通性 HOSTS=("8.8.8.8""114.114.114.114""www.baidu.com") FAILED=0 forHOSTin"${HOSTS[@]}";do ifping -c 1 -W 3"$HOST"> /dev/null 2>&1;then echo"[OK]$HOST可达" else echo"[FAIL]$HOST不可达" FAILED=$((FAILED+1)) fi done if[$FAILED-gt 0 ];then echo"网络检测失败:$FAILED个主机不可达" exit1 else echo"网络检测正常" exit0 fi
避坑指南
ping 通不代表网络完全正常,ping 只测试 ICMP 协议,TCP/UDP 可能被防火墙拦截
有些服务器禁用 ICMP ping,不通不代表网络不通
ping 结果受网络拥塞、路由跳数等多因素影响,要综合判断
快速 ping(ping -f)会发送大量数据包,可能影响网络性能,谨慎使用
19. netstat 与 ss — 端口与连接
netstat 和 ss 都用于查看网络连接、路由表、接口统计等信息。ss 是 netstat 的现代替代品,速度更快。
netstat 基本用法
查看所有连接:
netstat -an
参数说明:
-a:显示所有连接
-n:显示数字地址和端口(不解析域名)
-t:显示 TCP 连接
-u:显示 UDP 连接
-l:只显示监听状态的连接
-p:显示进程信息
-r:显示路由表
-i:显示网络接口信息
-s:显示网络统计信息
ss 基本用法
ss -tan state established
参数说明:
-t:显示 TCP 连接
-u:显示 UDP 连接
-a:显示所有连接
-n:不解析域名
-l:只显示监听端口
-p:显示进程信息
-o:显示计时器信息
state:过滤连接状态
常用连接状态
状态 说明 ESTABLISHED 已建立连接 SYN_SENT 发送连接请求,等待确认 SYN_RECV 收到连接请求,等待确认 LISTEN 监听中 TIME_WAIT 连接已关闭,等待处理残余数据包 CLOSE_WAIT 被动关闭,等待本地应用程序关闭 CLOSED 完全关闭 LAST_ACK 最后确认 CLOSING 同时关闭 实战示例
查看所有监听端口:
# netstat 方式 netstat -tlnp # ss 方式(更快) ss -tlnp
输出示例:
State Recv-Q Send-Q Local Address:Port Peer Address:Port Process LISTEN 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 端口的所有 IP ss -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:使用 netstat netstat -tlnp | grep :8080 # 方法2:使用 ss ss -tlnp | grep :8080 # 方法3:使用 lsof lsof -i :8080 # 方法4:使用 fuser fuser 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:找出连接数最多的 IP ss -tan | awk'/ESTAB/ {print $5}'| cut -d: -f1 | sort | uniq -c | sort -rn | head -20
优化 TIME_WAIT
Linux 内核参数调整:
# 启用快速回收 TIME_WAIT sysctl -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_reuse sysctl net.ipv4.tcp_fin_timeout
永久生效需要写入 /etc/sysctl.conf:
echo"net.ipv4.tcp_tw_reuse = 1">> /etc/sysctl.conf echo"net.ipv4.tcp_fin_timeout = 30">> /etc/sysctl.conf sysctl -p
避坑指南
netstat -an 会解析域名,速度慢。大服务器上建议用 ss
查看进程信息需要 root 权限
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 等)
-d:发送 POST 数据
-H:添加 HTTP 头
-A:设置 User-Agent
-v:显示详细请求和响应
-VV:显示更详细的调试信息
-i:显示响应头
-I:只显示响应头
-o:输出到文件
-O:下载文件并保存原始文件名
-L:跟随重定向
-s:静默模式,不显示进度条
-S:出错时显示错误
-w:自定义输出格式
-x:指定代理服务器
-k:不验证 SSL 证书
--cert:指定客户端证书
--key:指定客户端私钥
实战示例
发送 JSON 数据的 POST 请求:
curl -X POST https://api.example.com/users -H"Content-Type: application/json" -d'{"name":"test","email":"test@example.com"}'
带认证的请求:
# Basic Auth curl -u username:password https://api.example.com/profile # Bearer Token curl -H"Authorization: Bearer TOKEN"https://api.example.com/profile
下载文件:
# 下载并保存为 original_filename curl -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} Total Time: %{time_total}s "-s -o /dev/null https://www.example.com
检测网站可用性脚本:
#!/bin/bash URL=$1 EXPECTED_CODE=${2:-200} HTTP_CODE=$(curl -o /dev/null -s -w"%{http_code}"-L"$URL") if["$HTTP_CODE"="$EXPECTED_CODE"];then echo"[OK]$URL返回$HTTP_CODE" exit0 else echo"[FAIL]$URL返回$HTTP_CODE,期望$EXPECTED_CODE" exit1 fi
测试 API 响应时间:
curl -w" DNS: %{time_namelookup}s Connect: %{time_connect}s SSL: %{time_appconnect}s Total: %{time_total}s " -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=true forendpointin"${ENDPOINTS[@]}";do HTTP_CODE=$(curl -o /dev/null -s -w"%{http_code}"-L"$endpoint") if["$HTTP_CODE"="200"] || ["$HTTP_CODE"="204"];then echo"[OK]$endpoint->$HTTP_CODE" else echo"[FAIL]$endpoint->$HTTP_CODE" ALL_OK=false fi done if["$ALL_OK"=true];then echo"所有接口正常" exit0 else echo"部分接口异常" exit1 fi
与 JSON 处理结合
使用 curl 获取 JSON 并用 jq 解析(需要安装 jq):
# 安装 jq apt 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-urlencoded curl -X POST -d"username=admin&password=123456"https://api.example.com/login # multipart/form-data curl -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%。需要快速定位问题并处理。
排查步骤
查看 /var/log 目录下各子目录的大小
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 postrotate kill-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 # 或者用 truncate truncate -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 -typef -mtime +180 -print| head -100
统计文件数量
find /data/cache -typef -mtime +180 | wc -l
统计这些文件的总大小
find /data/cache -typef -mtime +180 -execdu -ch {} + | tail -1
确认无误后,分批删除(避免一次删除过多文件造成 I/O 负载)
# 分批删除,每批 1000 个文件 find /data/cache -typef -mtime +180 -print0 | xargs -0 -n 1000 rm -f
删除空目录
find /data/cache -typed -empty -delete
验证结果
df -h /data du -sh /data/cache/*
安全建议
生产环境执行删除操作前,先在测试环境验证
用 -print0 配合 xargs -0 处理文件名包含空格的情况
不要用 rm -rf 配合 find -mtime,避免误删
建议写一个带日期和数量记录的删除脚本
#!/bin/bash # 安全清理脚本 DIR="/data/cache" DAYS=180 BATCH_SIZE=1000 LOGFILE="/var/log/cleanup_$(date +%Y%m%d).log" echo"$(date)开始清理$DIR目录下${DAYS}天前的文件"| tee -a"$LOGFILE" # 统计文件数量 FILE_COUNT=$(find"$DIR"-typef -mtime +$DAYS| wc -l) echo"待删除文件数量:$FILE_COUNT"| tee -a"$LOGFILE" # 统计文件大小 TOTAL_SIZE=$(find"$DIR"-typef -mtime +$DAYS-execdu -ch {} + | tail -1 | cut -f1) echo"待删除文件总大小:$TOTAL_SIZE"| tee -a"$LOGFILE" # 确认操作 read-p"确认删除? (yes/no): "CONFIRM if["$CONFIRM"!="yes"];then echo"取消操作" exit0 fi # 分批删除 find"$DIR"-typef -mtime +$DAYS-print0 | xargs -0 -n$BATCH_SIZErm -f # 删除空目录 find"$DIR"-typed -empty -delete echo"$(date)清理完成"| tee -a"$LOGFILE"
案例三:分析服务器磁盘告警
场景描述
收到告警:服务器 /data 分区使用率超过 90%。需要分析原因并处理。
排查步骤
确认告警详情
df -h /data
输出:
Filesystem Size Used Avail Use% Mounted on /dev/sdb1 1000G 950G 50G 95% /data
查看 /data 下各目录的大小
du -h --max-depth=1 /data
输出:
700G /data/logs 200G /data/uploads 50G /data/db_backup
进一步分析日志目录
du -h --max-depth=1 /data/logs
输出:
500G /data/logs/myapp 200G /data/logs/nginx
分析 myapp 日志
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 年的旧日志,已归档但未清理
当前 2026 年的日志每天产生约 2G
需要保留最近 30 天的日志
执行清理
# 备份重要日志 mkdir -p /backup/logs_2024 mv /data/logs/myapp/2024/*.gz /backup/logs_2024/ 2>/dev/null mv /data/logs/myapp/2024/*.log/backup/logs_2024/ 2>/dev/null # 删除 2024 目录中的其他文件(保留压缩包) find /data/logs/myapp/2024 -typef ! -name"*.gz"-mtime +365 -delete # 清理 30 天前的普通日志 find /data/logs/myapp -typef -name"*.log"-mtime +30 -delete # 压缩 7 天前的日志 find /data/logs/myapp -typef -name"*.log"-mtime +7 ! -name"*.gz"-execgzip {} ;
验证结果
df -h /data du -sh /data/logs/*
设置定期清理任务
创建 /etc/cron.daily/cleanup-myapp-logs:
#!/bin/bash # 清理 30 天前的日志,压缩 7 天前的日志 LOG_DIR="/data/logs/myapp" DAYS_DELETE=30 DAYS_COMPRESS=7 # 压缩 7 天前的日志 find"$LOG_DIR"-typef -name"*.log"-mtime +$DAYS_COMPRESS! -name"*.gz"-execgzip {} ; # 删除 30 天前的日志 find"$LOG_DIR"-typef -name"*.log.gz"-mtime +$DAYS_DELETE-delete # 删除空目录 find"$LOG_DIR"-typed -empty -delete
设置执行权限
chmod +x /etc/cron.daily/cleanup-myapp-logs
总结
磁盘告警排查的闭环流程:
确认告警:df -h 查看实际使用情况
定位问题:du -h 逐层定位最大的目录或文件
分析原因:查看文件时间戳、日志轮转配置、业务日志产生速度
制定方案:确定清理范围、备份策略、预防措施
执行清理:先备份、再清理、验证结果
预防措施:配置日志轮转、定期清理任务、告警阈值调整
总结:20个命令速查表
命令 用途 常用参数 ls 列出目录内容 -l, -a, -h, -t, -S cd 切换目录 ~, -, .. cp 复制文件/目录 -r, -p, -i, -v mv 移动/重命名 -i, -v, -f rm 删除文件/目录 -r, -f, -i cat 查看文件内容 -n, -b, -s grep 文本搜索 -i, -v, -n, -r, -E head 查看文件头部 -n, -c tail 查看文件尾部 -n, -f, -F wc 统计行数/字数 -l, -w, -c chmod 修改权限 755, 644, +x chown 修改所有者 -R, user:group df 查看磁盘空间 -h, -T, -i du 查看目录大小 -h, -s, -d mount 挂载文件系统 -t, -o, -a ps 查看进程 aux, -ef top 实时监控进程 -d, -p, -u kill 终止进程 -9, -15, -TERM ping 测试连通性 -c, -i, -s netstat/ss 查看网络连接 -tlnp, -an curl 发送 HTTP 请求 -X, -d, -H, -v 学习建议
不要死记硬背,要在实际使用中记忆
每个命令的常用参数记住 3-5 个就够用了
学会组合使用:管道、重定向、后台执行
遇到问题先查 man 手册:man command
常用的复杂命令组合可以写成脚本保存
-
Linux
+关注
关注
88文章
11879浏览量
220062 -
命令
+关注
关注
5文章
768浏览量
24158 -
脚本
+关注
关注
1文章
415浏览量
29339
原文标题:新手必会:20个最常用的 Linux 命令详解
文章出处:【微信号:magedu-Linux,微信公众号:马哥Linux运维】欢迎添加关注!文章转载请注明出处。
发布评论请先 登录
20个最常用的Linux命令详解
评论