创建自定义systemd服务需编写.service文件并置于/etc/systemd/system/,配置unit[install]三段,指定绝对路径、用户权限、重启策略等,再执行daemon-reload、enable、start启用,并用status和journalctl排查路径、权限、type匹配等问题。

在 Linux 运维中安装配置 systemd 自定义服务,本质是写一个 .service 单元文件,告诉 systemd 如何启动、运行和管理你的程序或脚本。整个过程不复杂但容易忽略关键细节,比如路径权限、用户上下文和重启逻辑。
准备可执行的服务主体
确保你要托管的程序或脚本具备可执行性,并使用绝对路径:
- 脚本建议放在 /usr/local/bin/ 或 /opt/ 下(避免用 /root/,权限和可维护性差)
- 添加执行权限:sudo chmod +x /usr/local/bin/myapp.sh
- 脚本第一行必须是正确解释器声明,例如 #!/bin/bash 或 #!/usr/bin/env python3
- 如果依赖环境变量(如 PATH、PYTHONPATH),应在脚本内显式设置,或通过 Environment= 在单元文件中声明
编写 .service 单元文件
在 /etc/systemd/system/ 下新建文件,例如 myapp.service,内容分三段:
-
[Unit]:描述与依赖
— Description= 写清楚用途
— After=network.target 表示等网络就绪后再启动
— 如需强依赖远程服务,可用 Requires=network-online.target 并配 Wants= 提前拉起 -
[Service]:运行行为核心
— ExecStart= 必须用绝对路径,不能是相对路径或别名
— Type=simple(默认)适合前台常驻进程;若程序 fork 后退出主进程,应设为 Type=forking 并配 PIDFile=
— User= 和 Group= 指定最小权限运行身份(严禁直接用 root)
— WorkingDirectory= 显式指定工作目录,避免读取配置失败
— Restart=on-failure 或 always,配合 RestartSec=5 控制重试间隔 -
[Install]:启用逻辑
— WantedBy=multi-user.target 表示加入标准多用户运行级,启用后开机自启
加载并启用服务
写完文件后不能直接 start,必须让 systemd 重新读取配置:
- 刷新配置:sudo systemctl daemon-reload
- 启用开机自启:sudo systemctl enable myapp.service
- 立即启动服务:sudo systemctl start myapp.service
- 检查状态:sudo systemctl status myapp.service(重点关注 Active 行和日志摘要)
- 查详细日志:sudo journalctl -u myapp.service -n 50 -f
常见问题排查要点
启动失败大多源于以下几类错误:
- ExecStart 路径不存在或无执行权限 → 用 ls -l 和 file 命令验证
- 脚本内部报错但未输出到日志 → 在 [Service] 中加 StandardOutput=journal 和 StandardError=journal
- 权限不足(如写日志目录、访问 socket)→ 检查 User= 对应用户的目录和文件权限
- Type 类型不匹配 → 若程序启动即 fork 退出,systemd 会认为服务“已终止”,必须用 Type=forking 并提供 PIDFile=
- 依赖服务未就绪 → 查看 systemctl list-dependencies myapp.service 和依赖项的 status











