linux自定义systemd服务必须包含[unit]、[service]、[install]三段:[unit]定义服务描述与依赖(如after=network.target),[service]配置type、绝对路径execstart等运行逻辑,[install]通过wantedby=multi-user.target启用开机自启。

直接写一个符合规范的 .service 文件,放在 /etc/systemd/system/ 下,再用 systemctl 加载启用就行。关键不是“怎么写”,而是每个区块该填什么、为什么这么填。
服务文件必须包含三个区块
所有自定义 service 文件都得有 [Unit]、[Service]、[Install] 这三块,缺一不可:
-
[Unit]:讲清楚“这是什么服务”和“它依赖谁”。至少要有
Description=,推荐加After=network.target(多数服务需要网络);若强依赖数据库或 Redis,可加Requires=postgresql.service。 -
[Service]:核心运行逻辑。必须指定
Type=和ExecStart=(路径必须是绝对路径)。常见 Type:simple(前台常驻进程,如 Python Web 服务)、forking(传统 daemon,启动后父进程退出)、oneshot(只执行一次,需配RemainAfterExit=yes)。 -
[Install]:决定“什么时候启用”。必须有
WantedBy=,常用值是multi-user.target(命令行多用户模式),图形界面服务才用graphical.target。
关键配置项要写对
光有结构不够,几个字段写错会导致服务起不来:
-
ExecStart必须用绝对路径,比如/opt/myapp/start.sh,不能写./start.sh或~/myapp/start.sh; - 如果程序需要以特定用户运行,加上
User=www-data和Group=www-data; - 建议设
Restart=on-failure和RestartSec=5,让崩溃后自动重试; - 脚本类服务若需读取环境变量,用
Environment="PATH=/usr/local/bin:/usr/bin"显式声明; - 工作目录很重要,加
WorkingDirectory=/opt/myapp可避免相对路径出错。
放哪儿、怎么生效
文件位置和加载步骤直接影响是否生效:
- 始终把自定义 service 文件放到
/etc/systemd/system/(最高优先级,安全可控); - 编辑完必须运行
sudo systemctl daemon-reload,否则 systemd 完全看不到新文件; - 启用开机自启:
sudo systemctl enable your-service.service; - 立即启动:
sudo systemctl start your-service.service; - 查状态:
systemctl status your-service.service,看 Active 状态和最近日志; - 实时看日志:
journalctl -u your-service.service -f。
调试时先手动验证命令
很多启动失败其实跟 systemd 无关,而是脚本本身问题:
- 先在终端里手动运行
ExecStart那条命令,确认能正常执行、不报权限或路径错误; - 检查脚本是否有执行权限:
chmod +x /path/to/script.sh; - Type 选错很常见:Python 脚本用
while True:持续运行,就该用Type=simple,不是forking; - 如果服务刚启动就退出,先看
systemctl status的 “Main PID” 和 “Status” 行,再查 journal 日志。











