0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

20个最常用的Linux命令详解

马哥Linux运维 来源:马哥Linux运维 2026-06-02 10:25 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

新手必会: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运维】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    IC打工人最常用20Linux命令

    我看到一些IC初学者,竟然纠结于看哪本Linux书,甚至有人看视频教程一集一集的学。笔者认为,学IC重要的是IC本身,而工具类的东西,等你用了再去学也不迟,何况IC打工人也用不到那么多Linux命令
    的头像 发表于 04-19 09:34 2130次阅读

    最常用Linux命令盘点

    玩过Linux的人都会知道,Linux中的命令的确是非常多,但是玩过Linux的人也从来不会因为Linux
    发表于 07-11 08:21

    Linux常用网络命令

    Linux常用网络命令 Linux常用网络命令  计算机网络的主要优点是能够实现资源和信
    发表于 01-18 12:47 1406次阅读

    Linux关机命令详解

    Linux关机命令详解linux下一些常用的关机/重启命令有shutdown、halt、r
    发表于 01-18 12:52 4002次阅读

    Linux系统命令指南

    在“Linux 文件命令精通指南”中,我们讨论了利用最基础和最常用 Linux 文件命令所需的基本信息。在本文中,我将对
    发表于 05-23 10:23 1259次阅读

    linux常用命令实例详解

    ,就必须从Linux命令学起,通过基础的命令学习可以进一步理解Linux系统。不同Linux发行版的命令
    发表于 11-03 10:19 5806次阅读

    linux最常用20命令介绍

    Linux是一种自由和开放源代码的类UNIX操作系统。该操作系统的内核由林纳斯·托瓦兹在1991年10月5日首次发布。,在加上用户空间的应用程序之后,成为Linux操作系统。Linux也是自由软件和开放源代码软件发展中最著名的例
    发表于 12-15 15:46 8575次阅读

    解析对Linux系统管理员有用的并且最常用20命令行系统监视工具

    Linux/Unix 系统管理员非常有用的并且最常用20命令行系统监视工具。这些命令可以在
    的头像 发表于 01-16 09:03 6394次阅读
    解析对<b class='flag-5'>Linux</b>系统管理员有用的并且<b class='flag-5'>最常用</b>的<b class='flag-5'>20</b><b class='flag-5'>个</b><b class='flag-5'>命令</b>行系统监视工具

    Linux教程之常用Linux命令的详细资料免费下载

    操作。Linux操作系统提供的命令很多,但用户日常使用的命令却很有限。本章将介绍一些在日常工作中最常用Linux
    发表于 11-16 16:17 14次下载

    Linux最常用20命令汇总

    每个人使用Linux的目的都不同,所以常用命令差异非常大,而对于C/C++和shell程序编写较多人来说,也是存在很常用命令
    的头像 发表于 01-18 14:35 4448次阅读

    Linux中的35find命令用法

    Linux查找命令Linux系统中最重要和最常用命令之一。查找用于根据与参数匹配的文件指定的条件来搜索和查找文件和目录列表的
    的头像 发表于 02-02 16:53 4583次阅读
    <b class='flag-5'>Linux</b>中的35<b class='flag-5'>个</b>find<b class='flag-5'>命令</b>用法

    linux最常用20命令

    cd命令这是一非常基本,也是大家经常需要使用的命令,它用于切换当前目录,它的参数是要切换到的目录的路径,可以是绝对路径,也可以是相对路径。
    的头像 发表于 03-01 16:30 1.5w次阅读

    Linux最常用命令之一copy引发的思考

    cp 引发的思考 cp 是啥 ? 是的,就是 LinuxLinux最常用命令之一,copy 的简写,小伙伴 100% 都用过。 cp
    的头像 发表于 04-06 16:36 3539次阅读
    <b class='flag-5'>Linux</b>下<b class='flag-5'>最常用命令</b>之一copy引发的思考

    Linux cat命令详解

    `cat`命令Linux最常用命令之一,`cat`命令的名称来自于con**cat**enate。它可以读取和连接文件,并将其内容写入
    的头像 发表于 12-14 17:24 1.2w次阅读

    Linux常用命令

    Linux常用命令
    的头像 发表于 01-12 11:19 1983次阅读