Systemd:通过管道输入到守护进程服务器?

Systemd:通过管道输入到守护进程服务器?

所以我有一个服务器,我可以使用例如从 bash 终端运行

java -jar spigot.jar

它将输出发送到标准输出(我相信),从而打印到终端屏幕。要从终端停止服务器,只需向服务器发送“停止”命令,此时服务器将启动关闭(保存当前数据等)。

但是,我不想每次重新启动时都必须启动服务器,或者有一个额外的 bash 终端与打开的进程挂在一起,所以我一直在尝试设置一个 systemd 服务来自动运行服务器,并且使用 .service 文件从(实际上是任何地方)获取标准输入,如下所示:

[Unit]
Description=Spigot Minecraft server daemon

[Service]
Restart=always
WorkingDirectory=*location where spigot.jar is*

StandardInput=tty
TTYPath=/dev/tty2

ExecStart=/usr/bin/java -jar spigot.jar
ExecStop=/bin/sh -c 'echo stop >/dev/tty2'

[Install]
WantedBy=multi-user.target

但我不明白为什么这行不通。我认为它应该做的是将 /dev/tty2 通过管道传输到服务器,当我使用命令时

systemctl stop *service*

它应该向服务器发送“stop”(间接通过/dev/tty2)。我缺少什么?

但该服务似乎没有运行?如果我注释掉 StandardInput 和 TTYPath 行,服务器将启动,但是在发出时

systemctl stop *service*

然后通过查看服务器日志

journalctl -u *service*

正确的关闭序列从未启动——进程只是被终止(而不是优雅地自行停止)。

所以我想知道的是:如何将此服务器作为服务运行,并将一些 FIFO/文件/tty/其他内容通过管道传输到其中(这样我仍然可以发出服务器命令)?

答案1

我猜你太努力了。关闭服务的标准方法是向其发送 SIGTERM 信号(礼貌)或 SIGKILL 信号(强制)。我相信这是默认systemd行为。因此,请尝试从单元文件中删除所有这些行systemd

StandardInput=tty
TTYPath=/dev/tty2
ExecStop=/bin/sh -c 'echo stop >/dev/tty2'

Spogit 网站上有很多关于使用 SIGTERM 和 SIGKILL 的参考资料

相关内容