我有一个服务器,如果有人尝试连接到它,它应该会激活。为此,我创建了一个 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 操作,从而导致“停用”行为。
您应该确保ExecStart
和ExecStop
命令以零状态退出并且不会挂起,以便 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,所以它会重新启动并且一切都按预期工作。