Minecraft 重啟 bash 腳本不會執行 init.d/service 命令
我打算做什麼
我正在嘗試為我的 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
了伺服器,則伺服器啟動得非常好。在遊戲中,如果我鍵入/restart
Minecraft 伺服器會按預期關閉,但不會再次重新啟動。查看我的zzz.log
文件,我可以看到問題在於exec /etc/init.d/minecraft start
命令,當 Minecraft 執行restart.sh
腳本時,這條線永遠不會成功執行。為什麼是這樣?初始化腳本
我從這裡獲得了初始化腳本。這使我可以
start
,stop
,restart
Minecraft 伺服器以及各種其他命令來控制 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
,現在我們可以輸入命令讓伺服器停止stop
或restart
,這些也可以在遊戲中以相同的方式使用(記得/
在遊戲中添加控制台時)總是為你做這個)。Minecraft 伺服器現在應該關閉,並且在RestartSec
指定的時間過去後,您應該能夠通過重新連接到screen
再次或使用systemctl status minecraft
(用於q
退出)來驗證 Minecraft 服務是否再次執行。進一步閱讀
我在 Redhat 文件站點上發現這個頁面也提供了一些資訊。(評論中的連結,我沒有足夠的代表發布 3+ 連結)。