当前位置:首页>Linux>Linux--systemd 服务管理

Linux--systemd 服务管理

  • 2026-10-11 06:20:15
Linux--systemd 服务管理

「快慢笔记」原创 · 阅读约 5 分钟

 Linux 系统的"总管家"-systemd 。一篇讲透 4 个核心:服务怎么跑、怎么开机自启、怎么排查、怎么读懂日志。1 个服务跑通,其他服务照搬。


一、systemd 是干啥的

systemd 是 Linux 的系统与服务管理器(PID=1),开机后拉起所有服务 + 监控 + 记日志。 systemctl 就是它的命令行工具。
它接管系统的 5 件事:

二、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 个:

  1. 你自己写的脚本(比如 /usr/local/bin/myapp)
  1. 源码编译安装的服务
  1. 容器当服务跑(podman generate systemd)
  1. 想改默认参数(用 systemctl edit <unit> 做 drop-in,不用重写)
  1. 定时 + 一次性任务(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 found
status显示Loaded: not-found
systemctl cat foo                                 #看路径 find /usr/lib/systemd /etc/systemd -name 'foo*'  #搜文件 daemon-reload                                   #刷一下

常见原因:文件名拼错 / 改了文件没 reload。daemon-reload 只刷已存在 unit 的配置变更,不识别新文件。


故障 2:端口被占 — Address already in use
nginx启动报98: Address already in use
journalctl -u nginx -p err         #看错误 ss -tlnp | grep :80               #找占用进程 +kill <PID>                       #关占用进程

常见原因:apache2 / nginx / httpd 互抢 80/443 端口。装新服务前先 ss -tlnp 看看谁在用。


故障 3:ExecStart 路径错 — status=203/EXEC
status显示code=exited, status=203/EXEC
status                            #看 Exit Code +which myapp                      #看正确路径 +ls -l 绝对路径                   #看权限(没 x 权限要chmod +x)

常见原因:ExecStart 没写绝对路径,或二进制没执行权限。


故障 4:启动后死循环重启
status: activating (auto-restart)反复出现
status                                  #看 Restart 计数 +journalctl -u --since "10 min ago"     #看应用自己的日志(/var/log/)。

常见原因:应用层报错,systemd 救不活,systemctl reset-failed 可清计数。别死磕 systemd,先看应用自己的日志。


五、1 句最终口诀

systemd 80% 的活:
看 →systemctl status
控 →start / stop / restart / reload
自启 →enable --now
排错 →status+journalctl -u --since "10 min ago"
记住这 4 句,80% 场景够用。

📚 系列导航

  • 上一篇
    :《Linux 文本处理三剑客-grep-awk-sed》
  • 下一篇
    :《Linux性能监控全攻略》

最新文章

随机文章