很多人对 Linux 的印象停留在“命令行黑框框”,觉得难上手、命令太多记不住。但真正用了几年之后你会发现,日常高频的操作其实就那么几十条,把这些组合好了,效率能翻好几倍。这篇内容我不打算列一堆 man 手册式的命令大全,而是把我和团队在实际环境里每天都会碰到的 Linux 实用操作挑出来,讲清楚每条操作解决什么问题、为什么这么用、有哪些坑,希望对还在摸索的同学有实际帮助。
不管你是刚转过来做运维、天天跟服务器打交道的开发,还是自己搭过几个小服务的技术爱好者,这篇都值得花几分钟过一遍。按照我自己的经验,只要把文件处理、系统监控、网络排查和日志定位这几块理顺了,应付绝大多数线上问题就够用了。
1. 先想清楚:什么样才算真的“实用操作”
1.1 别背命令,先按场景归类
刚开始学 Linux 的时候,我也干过对着命令大全从头背到尾的蠢事,今天背了明天忘,真正上了服务器还是一脸懵。后来慢慢发现,Linux 操作的核心不是记住每个命令的每个参数,而是把命令按照使用场景归类,遇到问题时能快速想到用哪一类去解决。
我习惯把日常操作分成四块:文件与权限、系统与进程、网络与连接、日志与排查。这四块基本覆盖了 90% 的日常维护场景。每一块只要掌握几个高频命令的常规参数,再配合一两招组合用法,就完全够了。举个例子,排查磁盘问题时你不需要背 20 个工具,一条 df、一条 du 加一个 lsof,就能定位到谁在占用空间。
还有个习惯很关键:别用管理员权限硬刚一切问题。很多刚上手的朋友动不动就 sudo,其实这是非常不好的操作习惯,它会掩盖权限设计的本来面目,而且容易误伤系统文件。我见过有人在生产环境执行 sudo rm -rf,直接把目录路径写错,删了一整块数据盘,那种教训是真金白银换来的。
1.2 从需求反推工具,而不是从工具找需求
实用操作的第一个原则,是从你手头的问题出发,反推需要什么命令。举个最简单的例子:你想看一台服务器上某个进程的 CPU 占用情况,那核心需求是获取进程的 PID,然后查看这个 PID 的资源使用率。顺着这个需求,你会想到 ps、pidof、top、htop 这一串命令。但如果你只是为了确认某个服务在不在运行,一条 systemctl status 就比 ps -ef 加 grep 更合适。
这种反推思路的好处是,你不会被工具清单淹没。每学一个新工具,你先问自己:它解决什么问题?它比我已经掌握的方案好在哪?如果只是功能重复,那就没必要花精力。我自己其实很少装额外的监控面板,原因很简单——系统自带的那一套组合命令,在日常排障里已经足够快了,没必要为了“看起来专业”去多维护一套工具链。
1.3 实用优先的另一个体现:组合命令胜过单条命令
单个命令能做的事很有限,但命令之间用管道、重定向、逻辑符号组合起来,威力就完全不一样了。我刚工作那会儿,前辈给我演示了一条命令就把某个目录下占用空间最大的 10 个文件列出来,当时真的觉得惊艳。后来我才意识到管道、xargs、sort、head 这些才是日常操作的灵魂,单独背每个命令的参数,效果远不如学会把它们串起来。
所以这篇文章后面给的操作,我尽量直接给你组合好的命令,你拿去就能用。组合命令看着长,但拆开来看都是简单零件,理解之后还能按自己的场景改。
2. 文件与权限操作:高频场景里的核心细节
2.1 查找文件别只会用 find,几个命令按需选
很多人一提到找文件就想到 find,但 find 其实是个重量级选手,全盘扫描起来慢,参数也复杂。实际工作里要根据你的具体需求去选工具。
如果只是想定位某个命令的可执行文件在哪,用 which 或者 type 就够了。which nginx会直接告诉你 nginx 的安装路径。想查找二进制、源码、帮助文档的位置时,用 whereis 更高效,它会从标准的系统目录里检索,速度很快,比如whereis nginx一下就把 nginx 相关文件的位置全列出来了。
如果是要基于文件名在数据库里快速搜索,用 locate(或者 updatedb 后的 plocate)。这个命令速度极快,因为它是查预建索引的。但要注意,新创建的文件可能还没进索引,需要先 sudo updatedb 刷新一次。我踩过这个坑:临时写了个配置文件找不到,拿 locate 搜了半天没结果,最后才反应过来是索引没更新。
find 更适合精确查找,比如按文件大小、修改时间、权限来搜。find /data -name "*.log" -mtime -7表示在 /data 下找 7 天内修改过的日志文件。find /data -type f -size +100M可以快速找出超过 100MB 的大文件,这在磁盘空间告警时很好用,比 du 一个个目录排查要快得多。实用排查大文件的组合命令是:find / -type f -size +1G -exec ls -lh {} \;,它会列出根目录下所有超过 1GB 的文件及详细信息。
2.2 权限管理:数字权限别再只会 777
权限是 Linux 里面新手最容易犯迷糊、老手也容易大意的地方。最常见的错误是一出现权限问题就 chmod 777,这样确实方便,但等于把文件敞开给所有人读写执行,安全隐患很大,尤其在有公网访问的服务器上。
理解权限的核心很简单:每个文件有三种身份(属主、属组、其他人),每种身份有三种权限(读 r、写 w、执行 x)。数字表示法就是把 rwx 分别换算成 4、2、1,加起来就是最终权限。比如 750 就是属主 7(rwx)、属组 5(r-x)、其他人 0(---)。
实际工作中我建议这样用:目录权限默认 755,文件权限默认 644,除非确实有必要才放宽。配置文件如果包含密码,权限至少设成 600。日志目录需要写权限时用 750,并保证属组正确。一条实用的排查命令是ls -l,看每一列的权限位和属主属组。有时候你明明改了权限还是不能访问,那就要往上层目录看,比如/home/user的权限是 700,那其他用户当然进不去下面的子目录。
还有一个细节容易被忽略——默认权限掩码 umask。新建文件默认没有执行权限、新目录默认权限是 755,都是 umask 在起作用。运行umask可以看到当前值,022 是常见配置。了解这个之后,你就明白为什么创建出来的文件不是你想要的那种权限了,问题往往出在 umask 而不是文件本身。
特殊权限位(SUID、SGID、Sticky Bit)使用频率不高,但碰到了要知道。比如chmod 4755给某个可执行文件加 SUID,让普通用户以文件属主身份运行;chmod 1777是典型的 /tmp 目录权限,允许任何人写入,但只有文件属主能删除自己的文件。这个 Sticky Bit 防止了用户之间互相删文件的问题,是个很经典的设计。
2.3 软链接与硬链接:用对了省事,用错了混乱
软链接(符号链接)相当于 Windows 的快捷方式,指向另一个路径,跨文件系统也没问题。ln -s /data/app/logs /var/log/app这种操作,可以把分散在各处的日志目录统一到 /var/log 下管理,非常实用。我在服务器上部署新服务时,都会把日志目录软链接到一个统一的数据盘路径,这样即使系统盘空间吃紧,日志也不会把根目录塞满。
硬链接则是在同一个文件系统内,给同一个文件创建多个目录项。ln /data/file.txt /data/file_hard.txt这样创建的是同一个 inode 文件的另一个名字,修改任何一个,另一个也会跟着变。硬链接有几个限制:不能跨文件系统,不能给目录创建硬链接。所以实际使用中,硬链接最大的价值在于解决“同一个大文件需要在多个位置引用,不想重复存储”的场景。比如某个 20GB 的数据文件需要在几个目录下都有入口,用硬链接就只占一份空间。
但硬链接也有坑。我遇到过同事对日志文件做硬链接,然后又用 truncate 清空日志,结果原文件的日志也被清掉了,因为两个名字指向同一个 inode。排查了半天才定位到问题。所以我的建议是:你只是想快速访问某个路径,用软链接;你需要节省存储空间且确定不会出现双写场景,再考虑硬链接。用错了不仅混乱,还可能出现数据管理上的麻烦。
3. 系统监控与排查:别等出问题了才开始学
3.1 进程与负载:从 ps 和 top 看门道
排查系统问题时,第一条命令通常是 ps。但 ps 的参数有好几种风格,混着用很容易记混。我常用的几种:ps -ef显示所有进程及完整命令行信息;ps aux类似于 -ef,但额外展示 CPU 和内存占用百分比,排障时更直观;ps -ef | grep java是判断某类进程有没有在跑的经典姿势,不过 grep 会匹配到自身,通常加grep -v grep过滤掉。
想看动态变化,就用 top 或 htop。top 默认按 CPU 占用排序,能看到平均负载、进程数、CPU 各核心使用率、物理内存和交换分区情况。进去按 P 按 CPU 排序,按 M 按内存排序,按 1 查看每个核心的负载。这一步很多人不知道,但实际特别好用。htop 如果系统里有,体验更人性化,可以上下翻、支持鼠标操作和树状结构。
关于“平均负载”,这里有个常见的误解。我看到很多文章说负载不能超过 CPU 核心数,超过就出问题了,这其实不够准确。load average 的 1、5、15 分钟三个数值,反映的是系统上处于可运行和不可中断状态的进程数。如果服务器是 4 核,短期负载到 5、6 并不说明一定有问题,还要结合进程到底在 CPU 上跑还是等待 IO。最实用的判断方法是:先看 1 分钟和 15 分钟的对比,如果 1 分钟持续走高且 CPU 使用率也很高,那就说明真的忙;如果 CPU 使用率不高但负载很高,那大概率是 IO 等待,比如磁盘读写卡住了,这种情况加 CPU 根本没意义。
3.2 磁盘、内存、CPU:三样资源怎么快速摸底
磁盘排查里,df -h是第一步,它会显示各文件系统的总容量、已用、可用和挂载点。看到某个分区 Use% 接近 100%,紧接着用du -h --max-depth=1 /路径逐层定位哪个目录占的空间最大。我习惯先 du 一层,发现了大目录再往下一层,这样比直接从根目录深挖要快很多。
再往下,如果发现某个文件明明删了但空间没释放,那就是有进程还握着这个文件的句柄。Linux 下删除文件只是断开了目录项,文件仍然存在直到所有打开它的进程关闭。这种场景用lsof | grep deleted可以找出哪些进程占着已删除的文件,定位到进程后让它重启或重载,空间才会真正释放。这个坑值得重点记住:删了文件磁盘空间没变化,第一反应不是重启服务器,而是先查 lsof。
内存这块,free -h是最直观的。但注意别只看 available 这一列,在 Linux 内存管理里,部分 cached 内存可以被回收用来应付突发请求,所以 available 是指可供新进程实际使用的估算值,更接近真实可用状态。如果 swap 使用率不断上涨,同时 available 持续走低,就要看看是不是内存泄漏了。定位内存大户可以用ps aux --sort=-%mem | head,直接排序列出内存占用最高的进程。
CPU 波动大的时候,用 top 观察持续几秒,结合mpstat -P ALL 1看每个核心的使用率是否均匀。如果某一个核心被打满而其他核心很空闲,可能是线程绑定或者单线程应用导致;如果所有核心都高,那说明确实是计算密集。这是排查 CPU 问题时一个基本的分流思路。
3.3 服务管理:systemctl 日常够用的子命令
现在主流发行版都使用 systemd 管理服务,这套体系学起来并不复杂。我日常用的非常集中:systemctl start/stop/restart 服务名,分别是启动、停止、重启;systemctl status 服务名查看服务的运行状态和最近日志;systemctl enable/disable 服务名设置开机自启或禁用;systemctl daemon-reload在修改了服务配置后重新加载配置文件。
服务配置文件放在/etc/systemd/system/和/lib/systemd/system/下,以 .service 结尾。我自己写服务配置的时候有几个必填项:ExecStart 是启动命令,尽量写绝对路径;WorkingDirectory 指定工作目录;Restart=always 让服务在异常退出时自动拉起;User= 指定以什么用户运行,这条很多人会忽略,结果服务用 root 跑,安全隐患很大。
排障时遇到最多的问题就是服务起不来。systemctl status会提示错误,比如说 bind 端口失败,或者配置文件加载失败。更完整的信息要配合journalctl -u 服务名 -n 50查看最近 50 行服务日志。有些服务启动失败是因为安全限制,比如 ProtectSystem 或者 PrivateTmp 这类加固选项导致进程无法访问临时目录。遇到这种情况,先看服务状态里的具体报错,别急着改配置,定位根因更重要。
3.4 日志排查:从 tail 到 journalctl
日志是 Linux 排障最重要的信息源,但不同场景要用的命令并不一样。
最简单的实时跟踪用tail -f /var/log/某个日志,加上-n 20可以先把最近 20 行打出来再开始跟踪。这个习惯很重要,如果直接 tail -f,它只显示新增内容,你会错过之前已经产生的报错信息。
在整个日志文件里搜索关键字时,用grep -i "error" /var/log/xxx.log | tail -50。加 -i 忽略大小写,避免写的日志和搜索的关键字大小写不同导致漏搜。碰到重复日志很多的情况,可以用grep -c统计出现次数,用grep -A 5 -B 5查看匹配行的上下文,这对排查异常特别有用。
systemd 系列的日志用 journalctl 查看。这里有个实用的组合,journalctl -u 服务名 --since today,只看今天服务产生的日志;journalctl -u 服务名 -n 100只看最后 100 行。如果日志特别多,先看最后的报错,再按时间点往前翻,是大多数人实际排障时的路径。系统日志占空间的问题也值得提前处理,对 journal 设置SystemMaxUse=200M可以限制它占用磁盘的容量上限,避免日志把系统盘塞爆。
4. 网络连接与文本处理:高频场景的实用组合
4.1 连通性排查:从 ping 到 curl 的逐层定位
网络出问题是线上最常见的事故原因之一。排查思路我一直遵循从物理链路到应用协议的逐层顺序。第一步就是 ping,验证对方主机是否可达、延迟多大。但这里要明确一个事实,很多服务器出于安全会禁 ping(比如在安全组里禁止 ICMP),在这种情况下 ping 不通不代表主机离线,所以这只是参考,不是最终结论。
TCP 端口连通性检查,我推荐 telnet 或者 nc。telnet 目标IP 端口如果显示 Connected 说明端口通,直接退出即可。不过 telnet 在很多精简系统上默认没有装,这时用 nc:nc -vz -w 3 目标IP 端口。-w 3 设置超时时间为 3 秒,避免长期卡住。-v 输出详细结果,-z 表示只扫描端口不发送数据。这条命令在检查本机服务端口是否对外开放时极其好用。
应用层协议验证用 curl 更实用。curl -I https://某站点发起 HEAD 请求,只看响应头,观察状态码和服务器版本。curl -v可以输出更详细的握手过程、TLS 证书、请求与响应头等信息,排查接口返回值,或者确认证书链是否完整,都很直观。实际排查中很多时候你会看到 curl 能通、浏览器打不开,那问题基本就锁定在代理、DNS 或者浏览器缓存上了。curl 作为排障工具可以帮我们快速把范围收窄。
4.2 端口与 DNS:从 ss 到 dig 的排查路径
经常有朋友问“端口怎么排查?哪些端口在监听?”,这就要用到 ss 命令了。它在大部分 Linux 发行版上是 iproute2 自带工具,替代了旧的 netstat。ss -lntp是我最常用的组合:-l 只显示监听中的端口,-n 用数字显示地址和端口,-t 只看 TCP,-p 显示占用端口的进程。一次执行就能看到当前机器上所有监听的 TCP 端口和对应的进程名。
连接数统计也是一样。ss -s看整体连接统计,ss -ant | awk '{print $1}' | sort | uniq -c统计各种 TCP 状态的连接数量。当线上出现大量 TIME_WAIT 连接时,用这个组合可以直观看到堆积程度,再决定是调整内核参数还是优化程序连接复用方式。
DNS 的排查往往被忽略,但域名解析错误会引发各种怪问题。排障顺序从简单到深入:ping 域名看能不能解析从域名到 IP;nslookup 域名看用的是哪个 DNS 解析的、返回了哪些 IP;dig 域名的输出更完整,能找到 CNAME 记录、TTL 和具体返回的解析结果。
有段时间某台服务器总是访问不到某个外部服务,ping 和 curl 都不行。后来用 dig 一查,发现这台服务器的 DNS 配置指向了一个已经被停用的内网 DNS 服务器,解析全部超时。查看/etc/resolv.conf确认 DNS 配置是排查过程中的标准动作,能解决大量“莫名其妙”的网络问题。
4.3 文本处理:grep、sed、awk 在日志场景中的高频组合
文本处理三剑客,是 Linux 实用操作里我最有心得的一块。很多人看到 awk 的语法就觉得头大,我诚实地讲,只要能掌握 awk 的字段逐条处理思路,就已经足够应付绝大多数日志分析场景了。
先用 grep 做“过滤筛选”的活。比如提取所有 ERROR 级别的行,去掉无关内容。再用 sed 做“替换编辑”的活。比如把日志里的时间戳格式中括号去掉,或者把 IP 地址统一脱敏。而 awk 最适合做“按列抽取统计”的活。
举几个实际例子。假设你的访问日志格式是IP 用户 时间 请求路径 状态码 响应大小,我想统计访问量排名前 10 的 IP,就可以用:
awk '{print $1}' access.log | sort | uniq -c | sort -rn | head -10这条命令先把每行第一列(IP)抽出来,sort 排序后 uniq -c 统计计数,再按数字倒序排序,最后取前 10。一行命令就把“谁在聚焦访问”这个问题回答了。想要统计状态码分布,就把第一列换成第几列,看你的日志格式:
awk '{print $NF}' access.log | sort | uniq -c$NF 表示最后一列,按状态码统计分布,能快速发现是不是有大量 5xx 错误。
sed 也经常在批量修改配置的场景里用。比如sed -i 's/OldConfig/NewConfig/g' /etc/nginx/nginx.conf,把所有出现 OldConfig 的地方替换成 NewConfig。-i 参数是直接修改文件,很多新手在测试时不加 -i 感觉没有变化,但加上 -i 后就真的改文件了,所以这条一定要备份好配置再操作。
4.4 重定向与管道:别再把数据弄丢
重定向符号在 Linux 里是基础中的基础,但很多人只认识>和>>,忽略了2>的存在。标准输出(1)和标准错误(2)是两个独立的输出流。如果你只写了command > output.log,那只是把正常输出写入文件,报错信息还是会打印到终端,看起来“文件里怎么什么都没有”。所以完整的写法是command > output.log 2>&1,也就是把标准输出和标准错误合并后统一写入文件。这条我记得有段时间线上排查脚本怎么不输出日志,最后发现就是少了 2>&1,错了一大截。
管道的使用也有学问。command1 | command2把前一个命令的输出作为后一个命令的输入,这是 Linux 操作最优雅的地方。但管道处理的是文本数据,如果文件名带有空格或者特殊字符,直接传给 xargs 会出问题,比如find /data -name "*.log" | xargs rm遇到带空格的文件名就会把路径拆开。解决方法是加-0选项配合print0,或者直接用xargs -I {}处理。
另外一个容易踩的坑是管道加上 sudo。sudo cat /root/xxx | grep ERROR的权限其实只作用于 cat,如果后面跟着sudo tee这种需要写入 root 目录的操作,就有点微妙了。处理方式是把整个命令用 sudo 包起来,或者使用 sudo -i 进入管理员 shell。这类问题经常在写自动化脚本时暴露出来,提前知道能省不少调试时间。
5. 实用操作避坑实录与常见问题速查
5.1 高频问题速查表
把一段时间里最常出错的操作整理成一张表,方便直接查阅。
| 问题现象 | 常见原因 | 处理方式 |
|---|---|---|
| 文件删了但磁盘空间没释放 | 还有进程持有该文件句柄 | lsof + grep deleted 定位进程,重启或重载 |
| find 找不到刚创建的文件 | locate 索引未更新 | 先跑 updatedb 再查 |
| chmod 777 后还是无权访问 | 上层目录权限不足 | 逐级检查目录权限和属主属组 |
| sudo 执行后命令仍报权限错误 | 环境变量或主目录权限切换异常 | 使用 sudo -i 或在命令前加env PATH=$PATH |
| tail -f 看不到已有报错 | 没有加 -n 参数 | tail -n 50 -f 文件 |
| grep 搜不到关键字 | 大小写不一致 | 加 -i 忽略大小写 |
| 端口看起来没监听但服务在跑 | 服务只绑定了 127.0.0.1 | ss -lntp 检查监听地址是否为 0.0.0.0 |
| systemctl 启动失败但日志无报错 | 服务配置里 User 目录不可访问 | 确认 WorkingDirectory 和 User 目录权限 |
这张表里的很多问题,其实不是 Linux 本身有多难,而是我们在排查时缺少一个固定的检查顺序。比如文件权限问题,先查文件本身,再从父目录到根目录逐级排查,基本上几分钟内能定位。网络问题则从 ICMP、TCP 端口到应用层协议层层递进,比乱试命令要快得多。
5.2 几条实战经验与建议
写到这里,分享几个我自己的使用习惯,算是踩过不少坑之后换来的。
第一个建议是给频繁使用的别名做好配置。编辑~/.bashrc加上别名配置,比如把ll设为ls -lh,把grep默认加--color=auto和--exclude-dir={.git,.svn},把rm -i变成默认交互提示。这些调整看着不起眼,但长时间下来省下的时间和减少的误操作数量是非常可观的。配置完执行source ~/.bashrc立即生效。
第二个建议是重要操作之前先备份,尤其是用到 sed -i、rm -rf、chmod -R 这些带递归或强制性质的命令。有人觉得这是老生常谈,但我见过太多次因为一个参数失误导致整个配置目录被改坏的例子。正确姿势是复制一份到临时目录,测试无误后再执行正式替换。
第三个建议是学会用 man 和 --help 快速查参数。这个看起来最简单,但很多人不用。遇到不确定的参数,先man 命令名翻一下选项说明,比去搜索引擎里翻一篇旧帖子靠谱得多。时间长了之后你会形成自己的命令使用手册,比任何付费课程都管用。
最后一个技巧:使用历史命令功能时,Ctrl+R反向搜索能帮你快速找回以前敲过的长命令。在交互式终端里每次搜索都会显示匹配结果,摁几次 Ctrl+R 会轮换匹配历史。等你手头常用的命令越来越多,这个操作比重新敲一遍要快太多。另外history加上!编号可以直接执行历史列表中的某条命令,配合history | grep 关键字使用非常顺手。
Linux 操作的学习曲线确实有点陡,但只要围绕高频场景反复练习,把文件权限、进程监控、网络排查和日志分析这些基本功打牢,绝大多数服务器问题都不至于让你手足无措。我个人在这种“用中学、学中用”的过程里受益最大,也希望这篇内容能帮你在实际工作中少走一点弯路。