如何使用螢幕控制 systemd 服務?
我已經設置了一個 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.jar
using的輸出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=always
和RestartSec=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
設置遊戲規則,傳播玩家,開始活動。