systemctl status nginx状态、PID、最近日志一屏看全,排查第一站。
约 1157 字大约 4 分钟
2026-05-14
现代 Linux 上,开机后第一个跑起来的进程(PID 1)几乎都是 systemd。它既是“系统的总管”,也是“服务的管理员”——你装的 nginx、数据库、定时任务,背后都由它拉起、守着、记录。搞懂 systemd 的几个核心概念,systemctl 才不是一串背下来的咒语。
理解 systemd 作为 PID 1 的角色,弄清 unit、service、target 三个核心概念,以及 unit 文件放在哪、怎么改。
systemctl status nginx状态、PID、最近日志一屏看全,排查第一站。
systemctl list-units --type=service看系统上有哪些 service unit 以及它们的运行状态。
systemctl cat nginx直接打印这个 unit 的完整配置,含 drop-in 覆盖。
systemctl --failed列出所有进入 failed 状态的 unit,开机排查必看。
内核启动完成后,会拉起第一个用户态进程,PID 固定为 1。在现代发行版上这就是 systemd。它的职责有两层:
所以 Linux 启动流程 的后半段、服务生命周期 的全部,本质都是在和 systemd 打交道。
systemd 不直接管“进程”,它管的是 unit。unit 是一个抽象——一个服务、一个挂载点、一个定时器、一个 socket,都是不同类型的 unit:
| 类型 | 后缀 | 是什么 |
|---|---|---|
| service | .service | 一个后台服务(最常见) |
| target | .target | 一组 unit 的集合,代表一种系统状态 |
| timer | .timer | 定时触发,systemd 版的 cron |
| mount | .mount | 一个挂载点 |
| socket | .socket | 一个监听 socket,按需拉起服务 |
每个 unit 由一个配置文件描述。你说“管理 nginx”,其实是 systemd 在读 nginx.service 这个文件。
一个 .service 文件描述“这个服务怎么启动、用什么身份、崩了要不要重启”。看一眼就懂:
[Unit]
Description=My App
After=network.target # 在网络就绪后才启动
[Service]
ExecStart=/opt/myapp/run # 启动命令
Restart=on-failure # 失败自动重启
User=myapp # 以受限账号运行
[Install]
WantedBy=multi-user.target # enable 时挂到这个 targetunit 文件的位置有讲究:
/lib/systemd/system/ —— 软件包自带的,不要直接改/etc/systemd/system/ —— 管理员自定义的,优先级更高,要改在这里改改完任何 unit 文件,必须 systemctl daemon-reload 让 systemd 重新读取,否则改动不生效。
target 类似旧 SysV 的“运行级别”。常见的 multi-user.target(多用户命令行)、graphical.target(带图形界面)。systemctl get-default 看默认进入哪个。一个服务 enable 时写的 WantedBy=multi-user.target,意思就是“到达多用户状态时,把我也带起来”。
改 unit 后必须 daemon-reload
最常见的“我明明改了配置却没生效”:改完 .service 文件忘了 systemctl daemon-reload。systemd 把 unit 配置缓存在内存里,不 reload 它读的还是旧的。另外不要去改 /lib/systemd/system/ 下的原始文件——下次软件包更新会覆盖你的改动;要定制就用 systemctl edit nginx 生成 drop-in,或在 /etc/systemd/system/ 下放同名文件。
| 误区 | 更稳妥的做法 |
|---|---|
| 改完 unit 文件直接 restart | 先 systemctl daemon-reload 再 restart,否则读的是旧配置 |
直接编辑 /lib/systemd/system/ 里的文件 | 用 systemctl edit 或在 /etc/systemd/system/ 放覆盖文件 |
| 把 systemd 当成只是“启动服务的命令” | 它是 PID 1,管初始化、依赖、监控、日志一整套 |
| 服务没起来只反复 restart | 先 systemctl status 和 journalctl -u 看失败原因 |
版权归属:Shuo Liu