Minecraft-Java-Edition

Minecraft 重啟 bash 腳本不會執行 init.d/service 命令

  • July 29, 2019

我打算做什麼

我正在嘗試為我的 Minecraft 伺服器創建一個重啟腳本,以便我的朋友可以/restart在遊戲中使用該命令,因為他們沒有 SSH 訪問我的伺服器來重啟 Minecraft。

我的劇本

目前我的restart.sh腳本包含

exec >> zzz.log
exec 2>&1

set -x

sleep 5

exec /etc/init.d/minecraft start

腳本分解

前兩行會將標準輸出和標準錯誤(Linux fluent 使用者已經知道)重定向到zzz.log文件中,這樣我就可以擷取輸出以幫助我弄清楚發生了什麼。

set -x也是幫助我弄清楚發生了什麼的另一部分,這將輸出執行的每一行,zzz.log因為上面的行將輸出重定向到那裡。

sleep(5)正如它所暗示的那樣會使腳本暫停 5 秒,這只是為了確保 Minecraft 有足夠的時間關閉。

exec將使以下命令/etc/init.d/minecraft start在不同的程序中執行。由於我不知道腳本是如何被呼叫的,我假設這可能是 Minecraft 伺服器的子程序,因此如果 Minecraft 伺服器程序死亡,腳本也會如此,這樣可以確保命令執行。

我的問題

現在,如果 Minecraft 伺服器處於離線狀態並且我執行./restart.sh了伺服器,則伺服器啟動得非常好。在遊戲中,如果我鍵入/restartMinecraft 伺服器會按預期關閉,但不會再次重新啟動。查看我的zzz.log文件,我可以看到問題在於exec /etc/init.d/minecraft start命令,當 Minecraft 執行restart.sh腳本時,這條線永遠不會成功執行。為什麼是這樣?

初始化腳本

我從這裡獲得了初始化腳本。這使我可以start, stop, restartMinecraft 伺服器以及各種其他命令來控制 Minecraft 伺服器。

我是如何得出這個解決方案的

感謝@dly 的評論,我現在有了解決方案!/etc/inittab在 Ubuntu 16.04 上不存在,但這/etc/systemd意味著該解決方案與最初的解決方案有些不同。

通過快速閱讀,我能夠找到一些關於systemd 單元文件的好資訊。這可能不是最好的資源,因為它不會告訴您是否應該將特定選項放在[Unit],[Service]或下[Install],但儘管如此,它會告訴您所需的關鍵選項。

關注有類似問題的使用者

下面將假設已經完成了用於 Minecraft/Bukkit 伺服器的 Ahtenus 初始化腳本的安裝步驟(這也適用於我的 Spigot 伺服器)。

首先,您需要執行此systemctl enable minecraft.service. 然後您可能想要編輯為您創建的單元文件,您可以使用 執行此操作systemctl edit --full minecraft.service,這將打開一個文本編輯器(在我的情況下為 nano,我沒有選擇)。在這裡您將能夠編輯參數。我這樣配置我的:

# Automatically generated by systemd-sysv-generator

[Unit]
Documentation=man:systemd-sysv-generator(8)
SourcePath=/etc/init.d/minecraft
Description=Minecraft server
Before=multi-user.target
Before=multi-user.target
Before=multi-user.target
Before=graphical.target
Before=shutdown.target
After=local-fs.target
After=remote-fs.target
After=network-online.target
Wants=network-online.target
Conflicts=shutdown.target

[Service]
Type=forking
Restart=always
TimeoutSec=1min
RestartSec=5
IgnoreSIGPIPE=no
KillMode=process
RemainAfterExit=no
PIDFile=/home/MyUser/minecraft/minecraft-server.pid
ExecStart=/etc/init.d/minecraft start
ExecStop=/etc/init.d/minecraft stop

[Install]
WantedBy=multi-user.target

其中大部分是為您自動創建的,但您可能需要更改和添加一些選項,因此我將介紹其中的一些選項。

  • SourcePath是初始化腳本的絕對路徑。
  • Description相當不言自明。
  • Restart有幾個選項,我選擇總是這樣,無論程序如何結束,它都會“總是”重新啟動。
  • TimeoutSec是在嘗試再次啟動之前啟動失敗的超時時間。
  • RestartSec是在關閉後再次啟動服務之前應該等待多長時間。
  • RemainAfterExit是否應將服務視為active即使在其程序退出之後。
  • PIDFile主程序的 PID 文件的路徑,它應該只包含 PID,並且在程序關閉時將被刪除,但永遠不會被systemd. Minecraft 初始化腳本將在啟動時創建它。
  • ExecStart執行以啟動服務的命令
  • ExecStop要執行以終止服務的命令

測試它是否有效

現在我們可以測試這個工作了,如果服務已經啟動,我們可以創建一個新的程序,systemctl restart minecraft即使這個服務沒有程序,它也會創建一個新的。然後我們可以使用screen連接到 Minecraft 控制台screen -r minecraft-server,現在我們可以輸入命令讓伺服器停止stoprestart,這些也可以在遊戲中以相同的方式使用(記得/在遊戲中添加控制台時)總是為你做這個)。Minecraft 伺服器現在應該關閉,並且在RestartSec指定的時間過去後,您應該能夠通過重新連接到screen再次或使用systemctl status minecraft(用於q退出)來驗證 Minecraft 服務是否再次執行。

進一步閱讀

我在 Redhat 文件站點上發現這個頁面也提供了一些資訊。(評論中的連結,我沒有足夠的代表發布 3+ 連結)。

引用自:https://gaming.stackexchange.com/questions/293374