手动停止的服务未正确停止

手动停止的服务未正确停止

我有一个服务器,如果有人尝试连接到它,它应该会激活。为此,我创建了一个 systemd 套接字和服务,为我的服务器构建代理并启动它。谢谢本教程这并不太难。

我制作了一个 FIFO 管道来与正在运行的服务器进行通信,如果没有人在其上活动,我希望服务器停止。如果我通过管道停止服务器,则 Server.service 保持在某种loaded deactivating stop状态,而 proxy.service 保持运行状态。 (状态自systemctl list-units

如果有人尝试再次连接,我希望服务重新启动,但这只有在我手动时才有效systemctl stop server.service


代理.socket

[Socket]
ListenStream=25565

[Install]
WantedBy=sockets.target

代理服务器

[Unit]
Requires=server.service
After=server.service

[Service]
ExecStart=/lib/systemd/systemd-socket-proxyd 127.0.0.1:25555

服务器.服务

[Unit]
Description=my Server

[Service]
User=nonRootUser
ExecStart=/home/nonRootUser/server/startup-fifo.sh
ExecStop=/home/nonRootUser/server/cmd stop

答案1

server.service属于Type=simple多种类型(如果指定了则为默认值ExecStart=)。

关于它,ExecStop=有一个有趣的花絮文档

请注意,ExecStop= 中指定的命令仅在服务首次成功启动时执行。如果服务根本没有启动过,或者启动失败,例如因为 ExecStart=、ExecStartPre= 或 ExecStartPost= 中指定的任何命令失败(并且没有前缀“-”),则不会调用它们,见上文)或超时...另请注意,如果服务成功启动,则始终会执行停止操作,即使服务中的进程自行终止或被终止也是如此。必须准备好停止命令来处理这种情况。

从你的问题来看,听起来好像server.service是“自己”终止(而是通过 FIFO 发送内容)。 systemd 将看到这一点并调用ExecStop.这可能会执行挂起的附加 FIFO 操作,从而导致“停用”行为。

您应该确保ExecStartExecStop命令以零状态退出并且不会挂起,以便 systemd 将服务注册为非活动状态。

答案2

我解决了这个问题,尽管它可能很难看。

我没有让 proxy.service 而是Requires=server.service让 proxy.service BindTo=server.service。这样,如果 server.service 停止或失败, proxy.service 会正确结束自身。

现在server.service仍然运行在loaded deactivating stop由于某种原因无法重新启动的状态。我让进程在脚本完成后失败exit 1,因此 server.service 进入状态loaded failed failed

因为 proxy.service 仍然需要 server.service,所以它会重新启动并且一切都按预期工作。

相关内容