前十章把终端的每个关节都拆开了。这一章往上走一层:带着这套模型,登录一台陌生服务器,工程师到底怎么干活。这不是命令清单(那种东西网上一搜一大把),而是「每个命令背后你在问什么问题」。
落地前三问:我是谁、我在哪、这是什么机器
刚 ssh 上一台新机器,老手的起手式其实是三个问题,每个问题对应一行命令:
- 我是谁?
whoami。别笑,这决定了一切——你是 root 还是受限用户,能不能装软件、改配置,全看这个答案。 - 我在哪台机器、什么系统?
hostname看机器名(同时操作五台服务器时,这是保命习惯——多少事故源于「我以为我在测试机上」),uname -a看系统内核。 - 这台机器还有多少余粮?
df -h看磁盘(最常见的服务器事故就是磁盘写满),free -h看内存,uptime看负载。
注意这些命令的共同点:它们不「干活」,只「报告」。命令行的世界分成动词(改东西)和名词(看状态),新手只学动词,老手先看名词。
一个总开关:一切皆文件
Linux 有个总纲式的设计:几乎所有东西都以文件的形式出现。想看的系统信息,先想想它可能「躺」在哪个文件里:
- 硬件信息?
/proc/cpuinfo、/proc/meminfo是文件,cat就能读。 - 某进程的状态?
/proc/进程号/目录下一堆文件,它打开了哪些文件、启动命令是什么,都在。 - 设备?
/dev/下的文件——第七章的 pty 从面、第六章的/dev/null垃圾桶都是。
这个设计的好处和第六章的管道一脉相承:既然都是文件,那套字节流工具(cat、grep、管道)对一切都通用。查系统状态不需要专门的图形面板,一条 cat /proc/meminfo | grep MemAvailable 就是监控。
权限:三条九格的心智模型
ls -l 输出的 -rwxr-xr-- 不用背,读法是一个模型:三个一组,「主人 / 同组 / 其他人」各一组,每组三格「读 r / 写 w / 执行 x」。报 Permission denied 时按模型问:我是谁(whoami)?这文件归谁(ls -l)?我在哪一组?缺哪一格?答案立刻清楚。
sudo 也放进模型里:它不是「开挂」,是「这条命令临时以 root 身份跑」。理解了第十章的进程模型就知道这意味着什么——那个进程 fork 出来就是 root,能做一切,包括把一切搞砸。所以老手的肌肉记忆里有一条:带 sudo 的命令敲回车前停一秒。
进程与端口:服务器上的「在发生什么」
「服务怎么挂了」类问题的标准动作链:
- 进程还在吗?
ps aux | grep 名字,或top看谁在吃资源。 - 端口在听吗?
ss -tlnp列出正在监听的端口和对应进程——「服务活着但打不开」多半是端口没监听或防火墙拦了,这一步直接分流。 - 日志说什么?
tail -f 日志文件实时追(配上第六章的| grep过滤),或者 systemd 系统的journalctl -u 服务名。第十章的退出码在这里是金线索:日志里 137 = 多半内存超限被杀,130 = 有人按了 Ctrl-C。
网络:curl 是你的侦察兵
「从这台机器能不能访问那个服务?」——curl -v 地址。它相当于一个只会发一个请求的命令行浏览器,-v 会把握手、跳转、响应头全摊开。配合 ping(通不通)、ss(谁占着端口),网络问题三板斧就齐了。往服务器搬文件用第八章的 scp,大量同步用 rsync(它只传变化的部分,断点能续——这是它比 scp 聪明的地方)。
比命令更重要的是三个习惯
最后说说教科书不教、事故报告里常见的东西:
- 破坏前先演习。
rm -rf之前先ls同一路径确认;有 dry-run 选项的命令(rsync 的-n)先空跑一遍。模型告诉你为什么:命令行没有回收站,字节写出去就收不回。 - 不懂就问机器。
man 命令、命令 --help、tldr 命令。没人背得下所有参数,老手的「记性」其实是查得快的肌肉记忆。 - 症状 → 分层 → 定位。服务器出问题别慌着重启。按本书的链条分层问:是网络(curl/ping)?是进程(ps/ss)?是资源(df/free)?还是终端本身在骗你(TERM 设错、输出被转义序列搞花)?每一层你都见过它背后的机制了——排查就是沿着因果链逐环验证。
一句话总结:和服务器打交道不是背一百条命令,是带着模型提问——我是谁、机器什么状况、文件归谁、进程和端口在干嘛、日志说了什么。命令只是问题的发音方式。
最后一章,把全书拆过的所有零件装回去,跟一次按键走完它的完整旅程。