Bash

如何使用螢幕控制 systemd 服務?

  • September 30, 2020

我已經設置了一個 systemd 服務來執行我的 Minecraft 伺服器。現在,我需要它在伺服器崩潰時重複啟動腳本。到目前為止,這是我的程式碼:

#!/bin/bash

while true; do
   cd /home/mcserver/Spigot
   echo Starting Spigot...
   echo 600 > ./restart-info
   java -jar spigot.jar
   echo Server has stopped or crashed, starting again in 5 minutes...
   sleep 300
done

我實際上可以查看spigot.jarusing的輸出systemctl status spigot,但我也想控制伺服器控制台,也許使用screen.

當我嘗試這樣做時:

screen -S "Spigot" java -jar spigot.jar

我會得到Must be connected to a terminal錯誤。此命令僅適用於終端(不在腳本中),我可以使用screen -r.

有沒有辦法“繞過”這個螢幕錯誤?我已經嘗試script /dev/null在螢幕命令之前放置。我不想將 screen 與 -d 和 -m 一起使用,因為它將在後台執行,並且腳本將繼續重新啟動我的伺服器。

我不想將 screen 與 -d 和 -m 一起使用,因為它將在後台執行,並且腳本將繼續重新啟動我的伺服器。

所以使用**-D**代替-d(注意大寫!)

-D -m 這也會以“分離”模式啟動螢幕,但不會派生新程序。如果會話終止,則命令退出。

由於screen不會派生新程序,它會在java執行時阻塞,並在伺服器停止時退出。

作為獎勵,如果您添加,-S spigot您可以通過附加到該螢幕來監控任何終端的輸出(甚至發送命令!)

而且…既然您無論如何都在使用 systemd 服務(而且您確實應該),為什麼要在腳本中執行此重啟循環?讓 systemd 使用Restart=alwaysRestartSec=5min

我懷疑您偶然發現了這篇部落格文章,該文章用於screen解決您的 Minecraft 伺服器在您停止時停止的問題$ java -jar spigot.jar,然後關閉您的 ssh 或 putty 會話。該方法似乎已成為關於如何執行我的世界伺服器的規範答案,即使它不是必需的。

systemd 是解決此問題的完全不同(更好)的解決方案,避免了對screen. 您可以使用 systemd 服務選項來實現您在腳本中所做的一切。


要執行原版 minecraft 伺服器,請/etc/systemd/system/minecraft.service使用以下內容創建:

[Unit]
Description=Minecraft Server

[Service]
Type=simple
WorkingDirectory=/home/minecraft
ExecStart=java -Xmx1024M -Xms1024M -jar /home/minecraft/server.jar nogui
User=minecraft
Restart=on-failure

[Install]
WantedBy=multi-user.target

將其設置為啟動後自動啟動systemctl enable minecraft

你問如何控制它:

$ sudo systemctl start minecraft   # Starts the service if it wasn't running
$ sudo systemctl stop minecraft    # Stops the service
$ sudo systemctl restart minecraft # Restarts the service
$ sudo systemctl status minecraft  # Find out how the service is doing
$ sudo journalctl -u minecraft -f  # Monitor the logs

除了為您提供一種向控制台發送命令來執行此操作的方法之外,這一切都做了,我們將設置一個伺服器將偵聽的文件,您可以通過創建以下 systemd 單元在其中編寫命令:

/etc/systemd/system/minecraft.socket:

[Unit]
PartOf=minecraft.service

[Socket]
ListenFIFO=%t/minecraft.stdin

/etc/systemd/system/minecraft.service

[Unit]
Description=Minecraft Server

[Service]
Type=simple
WorkingDirectory=/home/minecraft
ExecStart=java -Xmx1024M -Xms1024M -jar /home/minecraft/server.jar nogui
User=minecraft
Restart=on-failure
Sockets=minecraft.socket
StandardInput=socket
StandardOutput=journal
StandardError=journal

[Install]
WantedBy=multi-user.target

現在您可以通過將內容回顯到該文件中來發送控制台命令:

echo "help" > /run/minecraft.stdin
echo "/stop" > /run/minecraft.stdin

還有一點很酷的是,您可以將自己的自定義命令序列和cat整個文件放入控制台。比如你玩UHC,你可以開始一個新的世界,讓人們登錄,然後cat uhc.commands > /run/minecraft.stdin設置遊戲規則,傳播玩家,開始活動。

引用自:https://unix.stackexchange.com/questions/598221