「快慢笔记」原创 · 阅读约 5 分钟
Linux 系统的"总管家"-systemd 。一篇讲透 4 个核心:服务怎么跑、怎么开机自启、怎么排查、怎么读懂日志。1 个服务跑通,其他服务照搬。
一、systemd 是干啥的
systemd 是 Linux 的系统与服务管理器(PID=1),开机后拉起所有服务 + 监控 + 记日志。 systemctl 就是它的命令行工具。
二、3 步走通(80% 用户只走前 2 步)
第 1 步:看状态
systemctl status nginx #关键看 3 行Loaded(文件位置) Active(在不在跑) Main PID(进程号)# Loaded 路径 2025+ 主流发行版是 /usr/lib/systemd/system/<svc>.service
怎么判断:Active: active (running)= 在跑;failed= 起不来;activating (start)= 启动中
第 2 步:启停 + 重载(80% 用户只到这步就够了)
systemctl start nginx # 启动systemctl stop nginx # 停止systemctl restart nginx # 重启(停 + 启动,会中断几秒)systemctl reload nginx # 重载配置(不中断,**改完配置用这个**)
注:如果服务没写 ExecReload,systemctl reload 会报错——restart-or-reload 写法会自动尝试 reload,失败再 restart
第 3 步:写 unit 文件(20% 用户需要)
80% 用户用不到这一步——所有主流服务(nginx、mysql、redis、docker、postgresql、sshd)的 unit 文件装包时已经给你写好,在 /usr/lib/systemd/system/ 下,你只用 enable --now 就行。
需要自写的场景只有 5 个:
- 你自己写的脚本(比如
/usr/local/bin/myapp)
- 容器当服务跑(podman generate systemd)
- 想改默认参数(用
systemctl edit <unit> 做 drop-in,不用重写)
- 定时 + 一次性任务(timer + oneshot)
判定方法:systemctl list-unit-files | grep enabled 列出所有已启用服务,看哪些是自带(/usr/lib/systemd/system/)哪些是自写(/etc/systemd/system/)。
3.1 unit 文件是 systemd 跟你服务之间的"合同"
systemd 启动时把 /usr/lib/systemd/system/ 和 /etc/systemd/system/ 下所有 .service 文件读一遍记在小本本上;你改完文件必须 daemon-reload 通知它刷新小本本。
3.2 最小可用 unit 文件
写到/etc/systemd/system/myapp.service:[Unit]Description=My App[Service]ExecStart=/usr/local/bin/myappRestart=on-failure[Install]WantedBy=multi-user.target
4 个段头 + 3 个字段 = 7 行模板(Type=simple 是默认所以不写;After=network.target 看你需不需要)。80% 场景够用。
3.3 写完文件 3 步让它跑起来
sudo systemctl daemon-reload # 1. 刷小本本sudo systemctl enable --now myapp # 2. 启动 + 开机自启systemctl status myapp # 3. 验证
ExecStart 必须写绝对路径(/usr/local/bin/myapp 不能写 myapp 或 ./myapp)。Type=simple 默认下 ExecStart 只能写 1 个命令,要多个用 ExecStartPre/ExecStartPost 或改 Type=oneshot。
四、4 大常见故障(80% 场景)
故障 1:服务起不来 — unit not foundstatus显示Loaded: not-foundsystemctl cat foo #看路径 find /usr/lib/systemd /etc/systemd -name 'foo*' #搜文件 daemon-reload #刷一下
常见原因:文件名拼错 / 改了文件没 reload。daemon-reload 只刷已存在 unit 的配置变更,不识别新文件。
故障 2:端口被占 — Address already in usenginx启动报98: Address already in usejournalctl -u nginx -p err #看错误 ss -tlnp | grep :80 #找占用进程 +kill <PID> #关占用进程
常见原因:apache2 / nginx / httpd 互抢 80/443 端口。装新服务前先 ss -tlnp 看看谁在用。
故障 3:ExecStart 路径错 — status=203/EXECstatus显示code=exited, status=203/EXECstatus #看 Exit Code +which myapp #看正确路径 +ls -l 绝对路径 #看权限(没 x 权限要chmod +x)
常见原因:ExecStart 没写绝对路径,或二进制没执行权限。
status: activating (auto-restart)反复出现status #看 Restart 计数 +journalctl -u --since "10 min ago" #看应用自己的日志(/var/log/)。
常见原因:应用层报错,systemd 救不活,systemctl reset-failed 可清计数。别死磕 systemd,先看应用自己的日志。
五、1 句最终口诀
控 →start / stop / restart / reload排错 →status+journalctl -u --since "10 min ago"
📚 系列导航
:《Linux 文本处理三剑客-grep-awk-sed》