为什么 systemd 在启动后立即停止我的服务?

为什么 systemd 在启动后立即停止我的服务?

我正在尝试在系统级别构建自定义服务。我有一个直接从终端运行时成功运行的脚本。该脚本激活特定的康达环境,然后使用 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继续在前台运行。

您有两种方法可以解决此问题:

  1. 不要使用 ,而是/path/to/insightd.sh检查脚本并提取必要的命令以在前台启动服务。

  2. 改成。Type=simpleType-forking文档:

    如果设置为forking,则预计配置的进程ExecStart=fork()作为其启动的一部分进行调用。当启动完成并且所有通信通道都建立后,父进程预计将退出。子进程继续作为主服务进程运行,当父进程退出时,服务管理器会认为该单元已启动。这是传统 UNIX 服务的行为。如果使用此设置,建议也使用该PIDFile=选项,以便systemd能够可靠地识别服务的主进程。一旦父进程退出,systemd 将继续启动后续单元。

相关内容