Linux service 个人服务管理规范
1. 文档目的
用于 Linux 主机使用 systemd 管理服务的方式,包括:
- 服务文件规范
- 统一的日志与目录要求
- 启停、上线、变更流程
- 服务异常排查方法
- 常见问题解决
适用于:后端服务、守护进程、数据处理任务等所有 systemd 托管的服务。
2. 服务文件基本规范
2.1 服务文件位置与命名
| 项目 | 规范 |
|---|---|
| 存放路径 | /etc/systemd/system/ |
| 文件后缀 | .service |
| 命名方式 | project-name.service(全部小写,使用短横线连接) |
示例:
1 | myserver-api.service |
禁止
- 放在
/usr/lib/systemd/system/(避免被系统升级覆盖) - 使用大写或空格命名
2.2 文件权限与属主
| 项目 | 要求 |
|---|---|
| 权限 | 644 |
| 所有者 | root:root |
命令:
1 | sudo chown root:root /etc/systemd/system/myserver.service |
2.3 WorkingDirectory 规范
要求:必须显式指定 WorkingDirectory,避免默认为 / 导致相对路径混乱。
目录规则:
- 工作目录统一放在
/opt/<project>/ - 日志目录在
/var/log/<project>/
示例:
1 | WorkingDirectory=/opt/myserver |
2.4 日志要求(journald)
systemd 使用 journald 管理日志:
- 必须设置
StandardOutput=append:/var/log/<project>/<service>.log - 必须设置
StandardError=append:/var/log/<project>/<service>.err.log - 日志目录权限由服务用户拥有
示例:
1 | StandardOutput=append:/var/log/myserver/myserver.log |
若使用 stdout 结合 journalctl,也允许:
StandardOutput=journal但需满足公司日志采集方案与审计要求。
2.5 服务运行用户
禁止以 root 身份运行服务。
要求:
- 必须使用独立用户,例如:
myserver - 用户由运维/管理员创建:
1 | sudo useradd -r -s /bin/false myserver |
服务文件中加入:
1 | User=myserver |
3. 标准 Systemd Service 文件模板
以下为可直接复制使用的规范模板:
1 | [Unit] |
4. systemctl 命令规范
4.1 服务增删改查常用命令
| 功能 | 命令 |
|---|---|
| 启动服务 | systemctl start xxx.service |
| 停止服务 | systemctl stop xxx.service |
| 重启服务 | systemctl restart xxx.service |
| 重新加载配置 | systemctl reload xxx.service |
| 查看状态 | systemctl status xxx.service |
| 开机自启 | systemctl enable xxx.service |
| 取消自启 | systemctl disable xxx.service |
| 重载 systemd | systemctl daemon-reload |
5. 服务上线/变更流程(规范化)
5.1 新服务上线
上传程序
1
2/opt/<project>/bin/
/opt/<project>/config/添加服务用户
1
useradd -r -s /bin/false <project>
创建日志目录
1
mkdir -p /var/log/<project> && chown <project>:<project> /var/log/<project>
编写 service 文件
放置至/etc/systemd/system/<project>.service设置权限
1
chown root:root ... ; chmod 644 ...
systemd 重载
1
systemctl daemon-reload
启动服务
1
systemctl start <project>
设置自启动
1
systemctl enable <project>
5.2 服务更新(程序变更)
替换二进制或配置文件
检查权限是否仍正确
重新载入 systemd(如服务文件变更):
1
systemctl daemon-reload
平滑重启
1
systemctl restart <project>
检查运行状态
1
systemctl status <project>
5.3 配置变更(无需重启程序)
如果服务支持 reload(在 service 中配置了 ExecReload):
1 | systemctl reload <project> |
否则必须 restart。
6. 服务异常排查流程
6.1 首步:查看状态
1 | systemctl status <project> |
重点关注:
- Active 状态
- Main PID
- 退出码 / 信号
- 最后几行日志
6.2 查看日志
1 | journalctl -u <project> -n 200 |
6.3 检查进程工作目录
1 | ls -ld /opt/<project> |
常见错误:日志目录权限不正确。
6.4 检查 ExecStart 路径
1 | file /opt/<project>/bin/binary |
6.5 检查端口占用
1 | ss -lntp | grep <port> |
6.6 检查环境变量
1 | EnvironmentFile= |
错误示例:
- 未加引号
- 环境变量文件不可读
7. 常见错误与解决办法
7.1 权限问题
| 错误信息 | 原因 | 解决 |
|---|---|---|
| Permission denied | 用户无权限访问启动文件/目录 | 修正目录属主为 service 用户 |
| Failed to start: “ExecStart permission denied” | 执行文件没有可执行权限 | chmod +x |
7.2 WorkingDirectory 相关
错误:
1 | Failed at step CHDIR |
原因:工作目录不存在或无权限
解决:创建目录并赋权。
7.3 ExecStart 相关
错误:
1 | Executable path is not absolute |
原因:禁止使用相对路径
解决:改为绝对路径。
7.4 依赖问题
错误:
1 | Failed to start: Dependency failed |
检查 unit 中是否配置了:
1 | After= |
7.5 环境变量问题
错误:
1 | EnvironmentFile=/xxx not found |
解决:加 -(可选加载):
1 | EnvironmentFile=-/etc/myserver/env.conf |
7.6 服务未重载 systemd
错误:
1 | Unit not found / service changes not applied |
解决:
1 | systemctl daemon-reload |
8. 附录: Minimal Service 模板
适用于绝大多数后端服务:
1 | [Unit] |
All articles on this blog are licensed under CC BY-NC-SA 4.0 unless otherwise stated.

