Linux 与系统管理
运维视角的 Linux 系统管理手册:不是「学会一条命令」,而是建立「出事时知道去哪查」的系统排查框架。示例语境:Ubuntu 22.04 / systemd / bash,命令需在真实环境验证。
系统分层与发行版
- 内核:管理硬件、进程调度、内存、文件系统与网络;版本形如
6.8.x,uname -r查看; - 发行版:内核 + 用户态工具 + 包管理的组合,两大族系:Debian/Ubuntu(
apt)与 RHEL/Rocky(dnf/yum);命令入口不同,概念一致; - 包管理纪律:生产环境锁版本与锁定仓库源;升级前看变更与备份;避免大版本自动滚动。
bash
uname -a # 内核与架构
cat /etc/os-release # 发行版信息
apt list --installed | grep nginx # 已装版本(Debian 系)文件系统与权限
FHS 目录速查:/etc 配置、/var 运行时数据(/var/log 日志、/var/lib 状态)、/tmp 临时、/home 用户、/proc 与 /sys 内核接口、/usr/bin 程序。
权限模型三条规则先记牢:
rwx对文件与目录含义不同:目录的r是能列出、x是能进入,改目录内容看w,删除文件看所在目录权限,与文件本身无关;chmod数字法(755= owner 全部、group/other 读+执行)对目录递归加-R前想清楚;chown改属主属组是特权操作,误把系统文件chown到应用账号会让服务起不来。
bash
ls -lh /var/log/syslog # 看权限与属主
stat -c '%a %U:%G %n' /etc/hosts
sudo chown -R app:app /opt/app # 递归改属主
umask 0022 # 新建文件默认权限基准- sudo 纪律:账号走
sudo而非直接用 root;用visudo编辑,NOPASSWD白名单只给明确命令; - 粘滞位与 suid:
/tmp的t位防止跨用户删文件;尽量不用 suid 程序。
systemd 与进程管理
bash
systemctl status nginx # 单元状态与最近日志
systemctl enable --now nginx # 开机自启 + 立即启动
journalctl -u nginx -n 50 -f # 跟随某服务的日志
systemctl daemon-reload # 改了 unit 文件后必须重载排查思路:先看进程有没有,再看日志说什么。
bash
ps -eo pid,ppid,stat,cmd | grep -v grep # 全量进程
pgrep -af nginx # 按名字找进程
htop # 交互式资源视图
ss -lntp # 监听端口与进程(替代 netstat)
kill -TERM <pid> # 先温柔后暴力:TERM → KILL- 僵尸进程:子进程结束父进程未
wait,若父进程持续产生僵尸,往往是业务 bug,不是 kill 能解决的; - 孤儿进程:父进程先亡,子进程被
init/systemd收养,正常现象。
网络排查:从「不通」到「找到断点」
一条命令一层层剥:
bash
ping -c 3 1.1.1.1 # ① 基础连通性(先排除 DNS/路由大方向)
curl -vI https://example.com # ② 七层通不通、TLS、响应头
ss -lntp # ③ 本地端口是否在监听
dig example.com A # ④ DNS 解析(非 resolv.conf 缓存层)
ip route # ⑤ 路由与默认网关
iptables -L -n # ⑥ 防火墙(或 nftables/ufw/云安全组)按序做一遍,基本能定位「域名没解析 / 没监听 / 被防火墙挡 / 对端没通」中的一类。
磁盘与空间排查
bash
df -h # 分区使用率(只看已挂载)
du -sh --exclude=proc /var/* | sort -h # 找大头
df -i # inode 耗尽会「磁盘有空间但写不进去」
lsof +L1 # 已删除但仍被进程占用的文件(日志轮转经典问题)- 日志轮转用
logrotate,别用「删掉日志」糊弄——句柄还开着,磁盘不会释放,重启进程才释放; /var/log单独分区(或至少监控),避免日志写满根分区拖垮系统。
Shell 与脚本纪律
bash
#!/usr/bin/env bash
set -euo pipefail # 出错即停 / 变量未定义即报错 / 管道失败不被吞- 脚本要幂等:重复执行结果一致(先判断再创建、
idempotent操作优先); - 不要在脚本里用交互式命令(
rm -i、mysql无密码提示); - 敏感信息走环境变量或密钥文件,不硬编码、不打进脚本仓库;
cron里跑脚本注意 PATH 与环境变量为空,日志要重定向到文件。
bash
# 每天 2:30 执行并留日志(cron)
30 2 * * * /opt/backup.sh >> /var/log/backup.log 2>&1长期任务优先用 systemd timer(可看日志、可控环境、可依赖),cron 适合简单调度。
常见坑速查
| 坑 | 现象 | 解法 |
|---|---|---|
| 删除文件磁盘没释放 | 空间依旧不足 | lsof +L1 找占用进程,重启或重开句柄 |
| 目录 755 看成文件可删 | 删不掉/误删 | 记住:删除看目录写权限 |
| 改了 unit 文件不生效 | systemctl 报错 | daemon-reload 先做 |
chown -R 整库误操作 | 系统服务起不来 | 操作前确认目标,备份属主表 |
| 看日志找不到服务 | 服务没起来 | ps + systemctl status + journalctl 顺序排查 |
| cron 环境变量空 | 脚本跑一半失败 | 脚本内显式 PATH;输出重定向留痕 |
| 端口通但连接失败 | 被防火墙/安全组挡 | 本地 ss、远端 nc -vz、云安全组逐层查 |
| inode 满 | 提示磁盘已满但 df 有空间 | df -i,删海量小文件 |
检查清单
- [ ] 生产变更前有回退方案,关键操作先备份;
- [ ] 服务走 systemd 托管且
enable自启,日志通过journalctl可查; - [ ] 权限遵循最小化:应用不用 root、目录属主正确、umask 合理;
- [ ] 网络故障有固定排查顺序并能快速定位断点;
- [ ] 日志已配置轮转并单独监控容量,无「磁盘写满」隐患;
- [ ] 脚本满足
set -euo pipefail与幂等,无明文密钥入库。