每一次 Linux 安装,几乎都以同样的方式开始。
你安装操作系统。
配置一些基础设置。
安装自己常用的工具。
然后告诉自己,系统设置以后再检查。
问题在于,“以后”往往会变成系统出问题的那一刻。
某个服务无法启动。
磁盘空间意外被占满。
网络出现故障。
防火墙规则的行为与预期不符。
随着时间推移,我养成了一个习惯。
每当我接触一台全新的 Linux 系统,无论是云服务器、虚拟机、工作站还是测试环境,在开始做任何事情之前,我都会运行一组简单的命令。
目的不是排查故障。
而是在真正需要排查故障之前,先充分了解这个系统。
这些年来,这十一条命令为我节省了数不清的排错时间。
1. uname -a
首先,我想准确知道自己面对的是怎样的系统。
这条命令可以立即告诉我:
很多故障排查都依赖内核版本和系统架构。
这是建立系统背景信息最快的方法之一。
2. hostnamectl
令人意外的是,不少系统都有令人困惑的主机名,或者主机配置并不完整。
它可以提供:
只需几秒钟,我就能判断当前运行的是虚拟机、云实例还是物理服务器。
3. lsblk
在接触存储之前,我希望先了解整个磁盘布局。
这条命令能够清晰展示:
相比逐个检查设备,它直观得多。
存储方面的意外,很少会是令人愉快的意外。
4. ip addr
网络通常是我最先检查的内容之一。
它会显示:
很多问题,只要看看网络接口配置,就会一目了然。
错误的子网。
意外出现的 IP 地址。
被禁用的网络接口。
配置错误的虚拟网卡。
很多线索,其实一直摆在那里。
5. ip route
仅仅知道 IP 地址还不够。
我还想弄清楚网络流量是如何转发的。
它可以显示:
这样,当以后出现网络连通问题时,我知道系统“正常状态”是什么样子。
6. systemctl list-units --type=service --state=running
想快速了解一台服务器,最有效的方法之一,就是看它当前运行着哪些服务。
systemctl list-units --type=service --state=running
短短几秒钟内,我就能识别出:
Web 服务器
数据库
监控代理
安全工具
定时运行的服务
与其猜测服务器用途,不如直接看它正在运行什么。
7. df -h
磁盘问题很少是突然发生的。
它们往往是日积月累形成的。
因此,我总会第一时间检查磁盘使用情况。
它可以快速显示:
这是简单的基准信息,却会在之后发挥巨大作用。
尤其是当有人说:
“服务器昨天还好好的。”
8. free -h
内存压力是无数性能问题的根源。
在安装软件或执行扫描之前,我希望先了解当前系统可用的资源。
它会提供:
尽早了解内存状况,可以避免后续做出错误判断。
9. pstree
大多数管理员都会查看进程列表。
但真正观察进程之间关系的人却少得多。
这条命令能够展示:
父子进程关系
服务层级结构
后台进程
正在运行的应用程序
当你真正看到各个进程是如何连接起来时,整个系统的架构会变得容易理解得多。
10. getenforce
如果系统启用了 SELinux,我希望第一时间知道。
它可能返回以下结果:
EnforcingPermissiveDisabled
许多部署问题,最终都可以追溯到 SELinux 策略。
提前确认这一点,可以避免后续大量不必要的困惑。
11. crontab -l
最后,我会检查系统中的计划任务。
通常还会再执行:
自动化任务往往能够解释很多现象,例如:
意外的文件变更
自动生成的报告
清理操作
备份任务
日志轮转
如果系统有任何事情自动发生,我希望在我措手不及之前就已经知道。
为什么我总是先运行这些命令
这些命令本身算不上令人兴奋。
它们不会让你的终端看起来很炫。
不会自动化你的工作流程。
也不会生成吸引眼球的截图。
但它们提供了更加宝贵的东西:系统上下文。
当问题真正出现时,最糟糕的处境,就是一边试图修复系统,一边才开始了解它是如何工作的。
这些命令帮我建立系统的基准认知。
它们告诉我:
这是一台什么样的系统;
它是如何连接到网络的;
它正在运行哪些服务;
它如何使用系统资源;
已经有哪些自动化任务在运行。
这些知识会随着时间不断积累,持续发挥价值。
如果第一天花几分钟收集这些信息,能在几周后的故障排查中节省数小时。
这也是为什么这十一条命令成为我接手新 Linux 系统时必不可少的第一步。
最好的故障排查,开始于系统出现问题之前。
参考
https://systemweakness.com/11-linux-commands-i-run-on-every-fresh-installation-344269910dd6