![为什么 systemd 在启动后立即停止我的服务?](https://linux22.com/image/220114/%E4%B8%BA%E4%BB%80%E4%B9%88%20systemd%20%E5%9C%A8%E5%90%AF%E5%8A%A8%E5%90%8E%E7%AB%8B%E5%8D%B3%E5%81%9C%E6%AD%A2%E6%88%91%E7%9A%84%E6%9C%8D%E5%8A%A1%EF%BC%9F.png)
我正在尝试在系统级别构建自定义服务。我有一个直接从终端运行时成功运行的脚本。该脚本激活特定的康达环境,然后使用 CLI 启动 Web 应用程序的本地实例。
问题...当我启动服务时,它会激活 Conda 环境并调用 CLI 来启动应用程序。应用程序完全启动,然后在 30 秒内停止。我正在使用简单的类型服务。根据我的阅读,如果服务启动并保持运行,并且在按Control+C 或以其他方式停止服务之前不会返回提示,则应使用此类型。
显示journalctl -u my_service.service
应用程序的日志(从数据库获取数据、启动及其运行的端口),然后推送关闭日志(停止应用程序...)。
这是我的服务:
[Unit]
Description=Testing
After=network.target
[Service]
Type=simple
ExecStart=/path/to/insightd.sh start
ExecStop=/path/to/insightd.sh stop
ExecReload=/path/to/insightd.sh restart
WorkingDirectory=/path/to/working-dir
Restart=on-failure
[Install]
WantedBy=multi-user.target
答案1
如果/path/tp/insightd.sh
是旧版 system-v 样式的 init 脚本,它可能会在后台启动该命令。从 systemd 的角度来看Type=simple
,这看起来就像你的服务启动然后立即退出。
对于Type=simple
,systemd 希望由 启动的进程ExecStart
继续在前台运行。
您有两种方法可以解决此问题:
不要使用 ,而是
/path/to/insightd.sh
检查脚本并提取必要的命令以在前台启动服务。改成。
Type=simple
Type-forking
从文档:如果设置为
forking
,则预计配置的进程ExecStart=
将fork()
作为其启动的一部分进行调用。当启动完成并且所有通信通道都建立后,父进程预计将退出。子进程继续作为主服务进程运行,当父进程退出时,服务管理器会认为该单元已启动。这是传统 UNIX 服务的行为。如果使用此设置,建议也使用该PIDFile=
选项,以便systemd能够可靠地识别服务的主进程。一旦父进程退出,systemd 将继续启动后续单元。