systemctl 与 journalctl 实战:enable 和 start 的区别、unit 文件与日志过滤
服务器重启之后服务没起来,明明之前 systemctl start 跑得好好的——因为 start 和 enable 是两件独立的事,只做了前者,服务就只活到下一次重启为止。这类概念没对齐的坑,systemd 里还有几个。
这是 Linux 命令系列的一篇,承接 Linux 常见命令与工具地图;服务器排查那篇 列了 systemctl/journalctl 的基本命令,这篇讲背后的概念和进阶用法。
systemd 和 unit:先对齐两个词
systemd 是现代主流 Linux 发行版(Ubuntu 16.04+、CentOS 7+、Debian 8+)的服务管理器,负责开机按依赖顺序拉起服务、运行期间盯着它们的状态。它管理的最小单位叫 unit——服务只是其中最常见的一类(.service),此外还有定时器(.timer)、挂载点(.mount)等类型。日常说”管服务”,操作的就是 service 类型的 unit。
start 管现在,enable 管开机:两件独立的事
1 | systemctl start nginx |
两者完全正交:start 了没 enable,重启后服务消失;enable 了没 start,当前这会儿服务并没有跑。部署新服务的标准动作是 enable --now,一次把两头都管上。
stop 的行为也值得知道:它默认先给服务进程发 SIGTERM 请求优雅退出,超时还没退才升级为 SIGKILL——正是 kill 信号那篇 讲的”先礼后兵”流程,systemd 帮你做好了。
systemctl status 输出怎么读
1 | ● nginx.service - A high performance web server |
unit 文件放哪、怎么改
unit 文件有两个主要目录,优先级不同:
/lib/systemd/system/(部分发行版是/usr/lib/systemd/system/):包管理器安装软件时放的,别直接改——包升级会把改动覆盖掉/etc/systemd/system/:管理员自己的地盘,优先级更高——同名 unit 在两边都存在时,以这里的为准
自己部署一个 Go 服务,最小可用的 unit 文件长这样:
1 | # /etc/systemd/system/myapp.service |
改完 unit 文件(新建、修改都算)有一步必做:
1 | systemctl daemon-reload |
journalctl:按服务、时间、级别过滤日志
systemd 托管的服务,标准输出和标准错误都被 journald 收集,用 journalctl 查,不用满盘找日志文件:
1 | journalctl -u myapp |
常用命令速查表
| 命令 | 作用 |
|---|---|
systemctl start/stop/restart 服务 |
启动 / 停止 / 重启(只管当下) |
systemctl reload 服务 |
平滑重载配置,不中断服务(需服务支持) |
systemctl enable --now 服务 |
设置开机自启并立刻启动 |
systemctl is-enabled 服务 |
查是否开机自启 |
systemctl status 服务 |
状态 + 最近日志,看 Loaded/Active 两行 |
systemctl daemon-reload |
改过 unit 文件后必跑,否则改动不生效 |
journalctl -u 服务 -f |
实时跟踪服务日志 |
journalctl -u 服务 --since "1 hour ago" |
按时间过滤 |
journalctl -u 服务 -p err -b |
本次开机以来的错误日志 |
写到这里
systemd 的坑基本都是概念错位:start 和 enable 各管一头(记住 enable --now)、unit 文件改在 /etc/systemd/system/ 且改完必须 daemon-reload。日志这边 journalctl -u 加上时间和级别过滤,比去 /var/log 翻文件体面得多。这套流程走顺了,自己部署的服务和发行版自带的服务就是同一套管理方式。









