很多做后端、测试或者刚接触服务器的同学,都会遇到同一个坎:本机写代码跑得挺顺,一登录到 Linux 服务器就手足无措。看别人敲 top、ss、journalctl、systemctl,几行命令就把问题定位了;自己拿到同样的机器,只知道 ls、cd、kill -9,出了问题第一反应是重启,重启不好就重装。这中间的差距,从来不是“记住了多少条命令”,而是有没有形成一套可复现的运维动作:怎么巡检、怎么定位、怎么变更、怎么验证、怎么回滚。
本文不打算再做一份“Linux 常用命令大全”,那种文章收藏了也不会看第二次。更值得写清楚的是:一个零基础的人,如何把零散的命令串成一条能解决真实问题的链路,从单机服务部署一路走到脚本化和批量自动化。文中所有示例都基于通用实践,版本细节请以你实际使用的发行版为准,不必逐字对照。
读完之后,你应该能独立完成这几件事:搭一个干净的实验环境并且不把它搞坏;用一条固定的排查顺序定位 CPU、内存、磁盘、端口类问题;把一个 Java 或 Python 服务用 systemd 管起来并做到开机自启、异常拉起;写一个能真正上生产巡检的 shell 脚本;用 Ansible 把同样的部署动作复制到多台机器上。这些能力拼起来,才叫“入门到实战”。
1. 这篇文章真正要解决的问题
先说一个很常见的误区:很多教程把 Linux 运维等同于“命令背诵”,于是学习者把 find、awk、sed 的参数背得滚瓜烂熟,真到了线上还是不敢动。原因很简单,真实运维场景里的难点不是在“这条命令怎么写”,而是在“我该先看什么、看到这个现象意味着什么、下一步动哪个开关是安全的”。命令是工具,判断才是能力,而判断能力只能靠清晰的流程和反复演练建立。
第二个误区是把“会用 Linux”和“会运维 Linux”混为一谈。会安装软件、会改配置文件,属于使用层面;而运维层面要额外承担三件事:一是可观测,你得知道系统现在处于什么状态;二是可回滚,任何变更前都要想好失败之后怎么退回去;三是可复制,同一套操作换一台机器、换一个同事,结果应该一致。这三件事决定了你在生产环境里是“帮忙”还是“添乱”。
第三个问题更隐蔽:很多人实验环境是随手搭的,快照不做、目录乱放、用 root 到处跑,结果练了半年,习惯全是反的。等真正接手一台有业务的机器,第一反应还是 chmod 777、rm -rf 一把梭。所以这篇文章在讲命令和脚本之前,会先用一整节讲环境规范和权限边界,这不是啰嗦,而是把后面的坑提前填掉。
本文面向三类读者:完全零基础但需要独立维护一台服务器的新人;会写代码但对 Linux 系统层不熟的开发者;以及做过一些手工运维、想把重复动作脚本化和自动化的同学。如果你已经能熟练编写 Ansible Role 和 Prometheus 告警规则,这篇文章对你的增量有限,但仍可以当作一份排查清单来对照。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. Linux 运维的知识地图与核心概念
学任何技术,先看地图再赶路,效率会高很多。Linux 运维的知识面看起来很散,实际上可以收敛成五块:文件系统、进程与服务、用户与权限、网络与端口、日志与时间。这五块之间不是并列关系,而是互相咬合的。举个例子,一个服务起不来,可能同时涉及权限(属主不对)、端口(被占用)、依赖(工作目录缺失)、日志(写在别处看不到),只盯着一个方向查,很容易绕圈。
2.1 一切皆文件:理解这个设计,很多现象就顺了
“一切皆文件”是 Linux 最核心的抽象。普通文件、目录、磁盘设备、管道、套接字,在文件系统里都有对应的路径。/dev/sda 是块设备,/proc/cpuinfo 是内核暴露出来的伪文件,/dev/tcp 甚至能拿来测端口连通性。理解这一点,你就能明白为什么 cat /proc/meminfo 能看内存、为什么重定向能操作设备、为什么“删了文件磁盘没释放”这种经典问题会出现——进程还持有那个 inode,目录项没了但空间没回收,得重启进程或者 truncate 才能释放。
与之配套的是挂载概念。磁盘要先分区、格式化、挂载到某个目录,才能被访问。新手最常见的困惑是“我 df -h 看到根分区满了,但 du 扫不出来是谁占的”,这往往是因为有文件被删除但被进程持有,或者有目录被另一个挂载点覆盖了。排查时要把 df -h、df -i(inode 使用率)、lsof +L1(找已删除但仍被打开的文件)三个动作连起来看,单看一个指标很容易误判。
2.2 进程、信号与服务:别再用 kill -9 当万能药
进程是运行中的程序实例。每个进程有 PID、父进程 PPID、属主、状态(R/S/D/Z)和一组资源占用。ps aux、top、htop 看的是快照,pidstat、vmstat 看的是趋势。新手容易忽略的是进程状态里的 D(不可中断睡眠),这种进程通常卡在 IO 上,kill -9 也杀不掉,得先解决底层存储问题,否则会越杀越乱。
信号是进程间通信的一种方式。SIGTERM(15) 是“请你体面退出”,SIGKILL(9) 是“立刻消失,不给清理机会”。规范的做法是先发 15,等几秒看进程是否退出,没退再考虑 9。因为很多服务收到 15 会去刷盘、关连接、释放锁,直接 9 很可能导致数据不一致。这个细节在数据库、消息队列、写日志的服务上尤其重要。
再往上一层就是服务管理。现在主流发行版都用 systemd,它接管了开机自启、依赖顺序、崩溃拉起、日志收集。理解 Unit 文件的几个关键字段(ExecStart、Restart、User、After、WantedBy),比记住几十条 service 命令有用得多。很多“服务莫名其妙挂了没人拉起”的问题,本质是 Unit 文件里没配 Restart,或者配置了但被 RestartSec 和启动失败次数限制挡掉了。
2.3 用户、权限与最小权限原则
Linux 的权限模型是“属主、属组、其他人”三段式,配合读(4)、写(2)、执行(1)三个位。chmod 改权限,chown 改属主,umask 决定新建文件的默认权限。看起来简单,但真正容易出错的是特殊权限位:SUID 让程序以文件属主身份运行,SGID 作用于目录时会让新建文件继承目录属组,Sticky Bit 用在 /tmp 上保证只有文件属主能删自己的文件。
比权限位更重要的是账号设计。生产环境的基本要求是:应用不以 root 运行;每个服务用独立系统账号;需要提权的操作走 sudo 并且只授权具体命令;禁止共享账号。这样一旦出问题,日志里能定位到人,影响面也能被限制住。很多人图省事让服务跑在 root 下,短期确实少了很多权限报错,但一旦应用被拿下,攻击者直接拿到最高权限,代价太大。
2.4 网络与端口:先分清“监听”和“连通”
网络排查最忌讳一上来就怀疑防火墙。正确的顺序是先看本机有没有在监听,再看本机能不能连自己,最后才看外部能不能连进来。对应命令是 ss -lntp 看监听、curl 或 nc 测本机回环、tcpdump 抓包确认请求有没有到达网卡。这三步能把问题范围迅速缩小到“服务没起”“监听地址不对”“链路不通”三者之一。
这里有个高频坑:服务监听在 127.0.0.1 上,外部自然连不上。配置文件里写 bind 127.0.0.1、server.address=127.0.0.1、listen 127.0.0.1:8080 都会导致这个结果。另一个坑是只监听了 IPv6 的 ::,而客户端走 IPv4,表现就是“本地能通、远程不通”。排查时用 ss -lntp 看清楚监听地址那一列,比猜快得多。
2.5 五个核心概念与常见误区对照
| 核心概念 | 它解决什么问题 | 新手常见误区 |
|---|---|---|
| 文件系统与挂载 | 数据如何持久化、空间如何分配 | 只看 df -h 不看 inode,忽略已删除但被占用的文件 |
| 进程与信号 | 程序如何运行、如何优雅停止 | 习惯性 kill -9,导致数据未落盘 |
| systemd 服务 | 开机自启、崩溃拉起、日志归集 | 只写启动命令,不配 Restart 和 User |
| 用户与权限 | 隔离风险、可追溯操作人 | 应用直接用 root 跑,权限一律 777 |
| 网络与端口 | 服务能否被访问 | 一上来查防火墙,不看监听地址 |
3. 实验环境准备与前置条件
再说一遍,实验环境一定要和练手环境分开,而且要做到“坏了能一键重来”。推荐的方式是本地虚拟机或者容器化环境:虚拟机负责完整演练 systemd、磁盘、内核参数这类系统级操作;容器负责快速验证脚本和配置。两者不要混用,容器里没有真正的 systemd,systemctl 跑不起来,新手在这里卡住会非常挫败。
具体准备清单如下。操作系统选择任意主流发行版即可,Ubuntu、Debian、Rocky Linux、openEuler 都能完成本文所有示例,差异主要在包管理命令(apt 与 dnf)和服务名上,遇到不一致时按你的发行版文档调整即可,本文不写死版本号。硬件方面 2 核 2G 足够,磁盘给 20G 以上,因为要演练磁盘占满的场景。务必在虚拟机管理软件里先打一个干净快照,后续每次做破坏性操作前都再打一个,这是最省时间的习惯。
需要提前安装的基础工具包括:vim 或 nano、curl、net-tools 或 iproute2、lsof、sysstat(提供 iostat、pidstat、sar)、rsync、tar、unzip。如果后续要演练自动化,再装 Python 3 和 Ansible。安装时建议统一用包管理器,不要手动下载二进制扔到 /usr/local/bin,否则依赖关系和升级会很难管。
目录规划也要一开始就定好,避免文件散落各处。约定 /opt/<应用名> 放程序与数据,/etc/<应用名> 放配置,/var/log/<应用名> 放日志,/opt/scripts 放运维脚本,/data 作为独立数据盘挂载点。配置和日志放在标准位置的好处是,绝大多数监控工具、日志采集器和同事的肌肉记忆都能直接适配,不用额外解释。
下面这段命令完成用户创建、目录初始化和 sudo 精确授权,可以直接复制执行。注意 sudoers 一定要用 visudo -f 编辑,它会在保存时做语法检查,手滑写错格式会被拦下来;如果直接 vim /etc/sudoers.d/xxx,语法错误可能导致所有人都无法提权。
bash复制# 创建专用系统账号,禁止登录 shell
sudo useradd --system --create-home --home-dir /opt/demo \
--shell /sbin/nologin demo
# 建立标准目录结构
sudo mkdir -p /opt/demo/logs /etc/demo /opt/scripts
sudo chown -R demo:demo /opt/demo
sudo chmod 750 /opt/demo /opt/demo/logs
# 只授权必要的 systemctl 子命令,遵循最小权限原则
sudo visudo -f /etc/sudoers.d/demo
text复制# 文件路径:/etc/sudoers.d/demo
demo ALL=(root) NOPASSWD: /usr/bin/systemctl start demo, \
/usr/bin/systemctl stop demo, \
/usr/bin/systemctl restart demo, \
/usr/bin/systemctl status demo
这段配置的含义是:demo 用户可以免密执行这四条命令,但仅限 demo 这个服务,不能重启别的服务,更不能拿到 shell。授权后可以用 sudo -l -U demo 验证生效范围。如果验证时报语法错误,说明 sudoers.d 里的文件权限不对,通常要求 0440 且属主是 root。
4. 核心流程拆解:一次完整的运维动作长什么样
运维动作可以抽象成一个固定闭环:观察、判断、变更、验证、留痕。这个顺序不要跳步。跳过观察直接变更,等于蒙;跳过验证直接走人,等于埋雷;跳过留痕,等于下次出问题还得从零查一遍。下面把这个闭环拆成可执行的步骤。
4.1 第一步:登录与基线巡检
登录后的第一件事不是急着敲命令,而是确认自己在哪台机器、什么时间、什么身份。hostname、date、whoami、uptime 四条一起敲,能避免“在生产环境干了测试环境的事”这类事故。很多严重误操作,根源就是终端窗口开太多,敲错了主机。
基线巡检关注五个维度:负载(uptime、top)、内存(free -h)、磁盘(df -h、df -i)、网络监听(ss -lntp)、近期错误日志(journalctl -p err -n 50)。这套动作每天固定跑一遍,你才会对“正常状态长什么样”有感觉。没有基线,等出问题时你根本无法判断哪个数值算异常。
4.2 第二步:按维度定位而不是按猜测定位
CPU 高先分清楚是用户态还是内核态,top 里看 %us 和 %sy,用户态高多半是业务计算或死循环,内核态高往往是系统调用频繁、上下文切换多。再用 pidstat -u 1 5 锁定具体进程,top -Hp <pid> 看线程,Java 应用可以接着用 jstack 抓线程栈对号入座。
内存问题要区分“用了多少”和“还剩多少可用”。free -h 里 available 才是关键指标,buff/cache 是可回收的,不要看到 free 很小就慌。真正危险的是 available 接近零并且开始出现 swap 交换,这时候系统会明显卡顿。排查方向是找出持续增长的进程,警惕内存泄漏。
磁盘问题先看容量再看 inode,两个都可能满。df -h 看容量,df -i 看 inode,用 du -sh /* 2>/dev/null | sort -h 逐层下钻定位大目录。日
