服务状态为 active (exited) 表明是 Type=oneshot 一次性服务,运行完即退出属正常设计;若需常驻,应改为 Type=simple 或 Type=forking 并调整启动方式,修改后执行 daemon-reload 和 restart。

服务状态显示 active (exited),但实际进程已不存在,说明该服务是一次性执行型(one-shot)服务,运行完就退出,systemd 认为它“成功完成”,所以标记为 active,而非持续运行。这不是故障,而是设计如此——但如果你本意是让它常驻运行,就需要调整配置。
确认服务类型是否为 one-shot
查看服务单元文件,重点检查 Type= 设置:
- Type=oneshot:服务启动后执行命令、退出,systemd 不监控进程;适合初始化脚本、部署任务等
- Type=simple(默认):systemd 认为主进程就是启动命令本身,需持续运行
- Type=forking:适用于传统守护进程(如 nginx、redis),启动后 fork 子进程并退出父进程
运行 systemctl cat 服务名.service 或查 /etc/systemd/system/服务名.service,确认 Type 值是否符合预期。
若需常驻运行:改 Type 并指定主进程
比如你写了个 Python 脚本想一直运行,却用了 Type=oneshot,结果一执行完就退出:
- 改为
Type=simple,并确保启动命令本身不后台化(不要加&或--daemon) - 如果程序必须用
nohup python app.py &启动,应改用Type=forking,并配合PIDFile=指向生成的 PID 文件 - 推荐方式:直接运行前台进程,例如
ExecStart=/usr/bin/python3 /opt/myapp/app.py
若本就是一次性任务,但希望“失败时也报错”
默认 Type=oneshot 下,只要命令退出码为 0,systemd 就标为 active (exited)。若想让异常退出被识别为失败:
- 在服务文件中添加
RemainAfterExit=no(默认值,可不写) - 关键:确保你的脚本在出错时返回非零退出码(
exit 1) - 加上
Restart=on-failure和RestartSec=3,可让失败后自动重试
验证与重载配置
改完服务文件后务必执行:
-
sudo systemctl daemon-reload(重新加载配置) sudo systemctl restart 服务名-
systemctl status 服务名观察是否变为active (running),或用ps aux | grep 关键词确认进程存在 - 查日志:
journalctl -u 服务名 -n 20 -f










