systemd 入门:从 unit 到服务自启动
在大多数现代 Linux 发行版上,开机后第一个启动的进程就是 systemd,它的进程号是 1。理解 systemd,基本就理解了服务是怎么启动、怎么自启动、出了问题去哪里查日志的。本文用一台普通的云服务器为例,从最常用的命令讲起。
一、systemd 是什么
systemd 既是初始化系统,也是服务管理器。它用 unit(单元)来描述一类资源:服务是 service,挂载点是 mount,定时任务是 timer,套接字是 socket。日常运维打交道最多的就是 service。
查看系统状态和版本:
systemctl status
systemctl --version
ps -p 1 -o pid,comm
第三条命令一般会看到 comm 是 systemd,这就确认了当前系统确实由它接管。
二、最常用的 systemctl 命令
以一个 Web 服务为例,名字假设为 nginx,实际操作前请先确认本机确实安装了它:
systemctl status nginx
systemctl start nginx
systemctl stop nginx
systemctl restart nginx
systemctl reload nginx
start 是启动,stop 是停止,restart 是先停再起,reload 是在不中断主进程的情况下重读配置。改了配置文件后,到底用 reload 还是 restart,要看服务本身是否支持重载,拿不准时先查文档,再用 restart 验证。
判断服务是否开机自启动、是否正在运行:
systemctl is-enabled nginx
systemctl is-active nginx
systemctl enable nginx
systemctl disable nginx
enable 只是在开机启动项里加上它,不会立刻启动;想立刻生效要再执行 start。disable 同理,只取消自启动,不会立刻停掉正在运行的服务。
三、写一个自己的 service 文件
假设我们有一个放在 /opt/demo/app 的可执行程序,想让它开机自启动、崩溃后自动拉起,可以新建一个 unit 文件:
[Unit]
Description=Demo App
After=network.target
[Service]
Type=simple
ExecStart=/opt/demo/app
WorkingDirectory=/opt/demo
Restart=on-failure
RestartSec=5
[Install]
WantedBy=multi-user.target
几个关键点要讲清楚:After 只表示启动顺序,不代表依赖;ExecStart 必须写绝对路径;Type=simple 表示主进程就是 ExecStart 启动的那个进程;Restart=on-failure 表示非正常退出时重启,配合 RestartSec=5 可以避免瞬间反复拉起。
写好后依次执行:
systemctl daemon-reload
systemctl enable demo.service
systemctl start demo.service
systemctl status demo.service
daemon-reload 是必须的:改了 unit 文件、新增或删除 unit 文件后,都要先让 systemd 重新读取配置,否则它用的还是旧配置。
四、查日志用 journalctl,而不是只翻文件
很多服务不再只把日志写到 /var/log 下的文件,systemd 会把标准输出和错误收集到 journal 里:
journalctl -u nginx -n 100 --no-pager
journalctl -u demo.service -f
journalctl -u demo.service --since "2026-10-27 00:00:00"
-u 指定服务,-n 看最近多少行,-f 实时跟随,–since 按时间过滤。服务起不来时,先看 status 里最后几行,再用 journalctl 看完整报错,多数情况下原因就写在那里,比如端口被占用、配置文件写错、权限不足。
五、target:理解运行级别的新说法
过去说的运行级别,现在对应 target。常见的是 multi-user.target(多用户命令行)和 graphical.target(图形界面)。查看和切换:
systemctl get-default
systemctl set-default multi-user.target
systemctl isolate multi-user.target
云服务器一般用 multi-user.target 就够了。set-default 改的是下次开机进哪个 target,isolate 是立刻切换,生产机器上不要随意 isolate 到不熟悉的 target。
六、新手最容易踩的坑
- 改了 unit 文件却忘了 daemon-reload,结果发现改动没生效。
- ExecStart 写了相对路径,或者程序依赖的环境变量没写进 Environment,导致手动能跑、systemd 拉起却失败。
- 把 enable 当成 start,重启后才发现服务其实一直没运行。
- 服务日志只看最后一行就下结论,实际上要结合 journalctl 的完整上下文。
- 在云服务器上改服务前没有先确认安全组和监听地址,服务明明已启动,外部却连不上,这往往不是 systemd 的问题。
七、一个最小排查流程
服务异常时按这个顺序走,一般不会绕远路:is-active 看状态,status 看最近输出和退出码,journalctl -u 看完整日志,检查端口和配置文件,最后才是重启服务。把每一步的结果记下来,再改配置、再验证,改动要一次只改一处。
掌握 status、start、enable、daemon-reload 和 journalctl 这几条命令,就能覆盖日常大部分服务管理场景。下一步可以再学 timer 做定时任务、学习 socket 激活和服务的资源限制,这些都是在 unit 文件里继续加配置,而不是换一套新工具。
- 点赞
- 收藏
- 关注作者
评论(0)