所以我有一个服务器,我可以使用例如从 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'