首页 / 新闻资讯 / 技术教程

systemd 服务单元编写入门:从零定义一个自启服务

2026-07-01分类:技术教程管理员

## 适用场景

自己写的守护脚本、第三方解压出来的程序、需要开机自启并挂掉自动拉起的服务,都可以用 systemd 服务单元管理,替代传统的 nohup 与 rc.local。顺云云服务器重装系统后,把 unit 文件随部署脚本一起下发,几条命令就能恢复全部自启项。

## 步骤清单

新建一个 unit 文件,路径放在 /etc/systemd/system/ 下,名称以服务名加 service 结尾。文件分三段:Unit 段写描述与依赖,Service 段写怎么启动,Install 段写装到哪个启动目标。一个最小可用的示例如下。

[Unit]
Description=Demo app service
After=network-online.target
Wants=network-online.target

[Service]
Type=simple
ExecStart=/usr/local/bin/app --config /etc/app.conf
Restart=on-failure
RestartSec=5
User=app

[Install]
WantedBy=multi-user.target

写完先执行 daemon-reload 让 systemd 识别新单元,再 enable --now 一步完成开机自启并立即启动。Restart 策略按业务定:常驻服务用 on-failure 或 always,一次性任务用 no。

## 验证方法

systemctl status 查看运行状态与最近日志,journalctl -u 服务名 -f 跟踪实时输出,systemctl is-enabled 确认自启已生效。重启机器一次是最可靠的验证,起不来的常见原因是路径写错、User 权限不足或依赖的目标不存在。

## 注意事项

脚本路径写绝对路径,环境变量不会继承登录 shell,需要时用 EnvironmentFile 显式引入。修改 unit 文件后必须再次 daemon-reload,否则改动不生效,这是新手最常踩的坑。ExecStart 里的程序必须前台运行,会自己 daemonize 的程序要找参数关掉后台化,否则 systemd 误判进程退出。

实际部署中还有几个高频报错值得单独记下。服务起不来时先看 status 输出尾部的错误描述与 journalctl -xe 的详细日志,启动命令路径不存在与配置文件语法错误占了大头。启动成功但几秒后退出,多半是程序依赖的环境变量没给够,或者程序要写的日志目录权限不足。这些信息 systemd 都记录在案,不要靠猜。

把服务交给 systemd 管理之后,重启策略要结合业务性质:内存缓慢泄漏的服务用 always 配定时重启兜底,批处理任务用 oneshot 搭配定时器,升级频繁的服务改完配置先 daemon-reload 再 restart,顺序颠倒会读到旧配置。unit 文件本身建议纳入版本管理,变更可追溯,把这些习惯固化成部署清单,服务管理就从玄学变成了流程。

技术教程