幻獸帕魯伺服器 24 小時不關機:開機自動啟動、當機自動重啟、定時重啟
《幻獸帕魯》伺服器要 24 小時不關機,靠的是三套彼此不能互相取代的機制:開機自動啟動、當機自動重啟、每日定時重啟。systemd 單元管得到哪些、管不到哪些,以及它掉了你怎麼第一時間知道。
「24 小時掛著」不是一個設定,是三套性質不同的機制:開機時自己起來、死掉時自己回來、還沒死就先停下來再起一次。三件事少做一件,就正好會在那一件上斷掉。伺服器還沒建起來的話,先看開服教學;這篇談的是讓一台已經在跑的伺服器一直跑下去。
24 小時不關機其實是三件事
斷線的方式有三種,每種由不同的東西擋住。
| 什麼讓它停了 | 需要什麼 | 設定在哪 |
|---|---|---|
| 核心更新或跳電之後機器重開 | 開機自動啟動 | systemd 的 enable |
| 記憶體不足被系統砍掉,或遊戲程式當機 | 當機自動重啟 | 單元裡的 Restart |
| 什麼都沒死,只是越跑越重 | 每日定時重啟 | timer 或 cron |
三者不能互相取代。Restart=on-failure 跟開機一點關係都沒有(那是 enable 的事),enable 不會把一小時前死掉的程式救回來,而記憶體慢慢爬升的那段時間裡兩者都不會動——因為那時候還沒有任何東西失敗。
還有一件需要人的第四件事:知道它掉了。三件都做齊,還是會遇到三件一起失手的那一晚,剩下的問題只是誰先發現、隔多久發現。
systemd 單元管得到什麼,管不到什麼
單元檔用開服教學裡那份,再在 [Unit] 段補兩行。這篇要看的是下面這幾行。
[Unit]
StartLimitIntervalSec=600
StartLimitBurst=5
[Service]
Restart=on-failure
RestartSec=10
[Install]
WantedBy=multi-user.target
WantedBy=multi-user.target 配上 sudo systemctl enable palworld,合起來才是開機自動啟動。教學裡 enable --now 的 --now 只是「順便現在也開起來」;只做 start 沒做 enable,今天一切正常,下次重開機它就不在了。這種失敗沒辦法在腦子裡驗證,挑一個沒人上線的時間真的 sudo reboot 一次,看它會不會自己回來。
Restart=on-failure 管得到的是非零的結束代碼,以及被訊號殺掉的情況——記憶體用光被核心砍掉屬於後者。
管不到的有三種:
- 正常結束(代碼 0)。 透過 REST 介面關掉的伺服器是乾淨結束的,
on-failure刻意不碰它。「腳本明明停下來了卻沒再起來」十次有九次是這個。 - 程式還活著但沒回應。 systemd 看的是程式,不是遊戲。進得去卻沒人動得了的時候,單元的狀態照樣是
active。 - 反覆失敗。 有了
StartLimit那兩行,10 分鐘內啟動失敗 5 次,systemd 就會放棄,停在failed。systemd 自己的預設是「10 秒內 5 次」,每次都要先等RestartSec=10的單元永遠碰不到這條線;少了那兩行,每次都死在同一個原因上的伺服器只會停在activating (auto-restart)無限重試。systemctl status palworld裡出現「start request repeated too quickly」不代表自動重啟壞了,它是在說每次都死在同一個原因上,該去看紀錄了。
別把那兩行刪掉或設成 StartLimitIntervalSec=0 來把第三種蓋過去。那只會讓一台因為存檔壞掉而起不來的伺服器每 10 秒重試到天荒地老,真正的原因被沖到幾千行以下。先用 journalctl -u palworld -n 100 讀最後一次失敗的理由,永遠比較快。
每日定時重啟不是可選項
Restart=on-failure 要等程式死了才動,而記憶體洩漏讓所有人一起變慢的那一段發生在死之前,所以每天還得主動重啟一次;為什麼會洩漏、間隔怎麼抓,寫在記憶體洩漏與定時重啟。反正每天都要停一次,版本檢查也可以折進去,做法在更新教學:版本不符與不掉存檔的順序。
要排程,cron 最短,腳本在上面那篇裡就有。想全部留在 systemd 裡的話,用 timer 也可以。
# /etc/systemd/system/palworld-restart.timer
[Unit]
Description=Restart Palworld daily
[Timer]
OnCalendar=*-*-* 04:00:00
[Install]
WantedBy=timers.target
同名的 palworld-restart.service(Type=oneshot)去呼叫真正的腳本,再用 sudo systemctl enable --now palworld-restart.timer 開起來,下一次執行時刻用 systemctl list-timers 看。不要加 Persistent=true。 那個選項是替機器關機期間錯過的排程在開機後補跑一次,而一台兩分鐘前才起來的伺服器沒有理由再重啟。
時刻挑沒人上線的凌晨,只要避開備份在跑的時段就好。
先公告、再倒數、存完檔才停
用 kill、systemctl kill 或直接按電源把它關掉,等於每天自製一次當機:自動存檔間隔內的進度直接消失,運氣差一點還會撞上正在寫入,留下寫到一半的 Level.sav——而它要到下次啟動才會暴露,那時候已經過了一天。
正確的停法是四步,全服公告 → 倒數計時 → 強制存檔 → 停止,四步都在官方 REST 介面裡(怎麼開、怎麼認證見 REST API 管理)。
PW='一個夠長的密碼'
API='http://127.0.0.1:8212/v1/api'
# 先把世界寫到硬碟上
curl -s -u "admin:$PW" -X POST "$API/save"
# 公告和倒數由介面代勞
curl -s -u "admin:$PW" -X POST "$API/shutdown" \
-H 'Content-Type: application/json' \
-d '{"waittime":60,"message":"Server is going down in 60 seconds"}'
message 不是聊天欄裡一閃而過、捲上去就沒了的一行,而是橫在每個玩家畫面正中央的一條橫幅:

/stop 是不預告、立刻切斷的那個,日常運作不要用它;/shutdown 會等滿你給的秒數,再照正常流程降下去。
而上一節的陷阱在這裡剛好合上:/shutdown 關掉的程式是正常結束,Restart=on-failure 不會把它拉起來。如果目的是重啟,就讓介面只負責存檔和公告,最後一行交給 sudo systemctl restart palworld;如果目的真的是停機(維護、搬家),/shutdown 本身就夠了。沒分清這兩者,是「凌晨停了就再也沒起來」最常見的成因。
它掉了你怎麼第一時間知道
預設的監控是「玩家會告訴你」,而這個通知的形式是週五晚上十點五個人在等。有三種更便宜的做法。
一行狀態。 systemctl is-active palworld 只會吐 active 或 failed。要看原因,就從當天的紀錄裡撈結束事件。
systemctl is-active palworld
journalctl -u palworld --since today | grep -i "main process exited"
連接埠。 遊戲用的是 UDP 8211,瀏覽器打不開也就驗不了,要看實際有沒有在聽,用 ss -lunp | grep 8211。
一分鐘的心跳。 本機 cron 每分鐘打一次 /metrics,失敗就往你真的會看的地方送一行。cron 拿不到你在 shell 裡設的 PW,所以密碼寫進一支小腳本,crontab 那行只負責呼叫它。
#!/bin/bash
# /home/palserver/heartbeat.sh:cron 每分鐘呼叫一次
PW='一個夠長的密碼'
curl -sf -m 10 -u "admin:$PW" http://127.0.0.1:8212/v1/api/metrics >/dev/null || /home/palserver/alert.sh
加上 -m 10,活著卻不回應的伺服器也會被當成掛了。腳本裡有管理員密碼,先用 chmod 700 /home/palserver/heartbeat.sh 讓別人讀不到,再掛進 cron:
* * * * * /home/palserver/heartbeat.sh
千萬別為了讓外部監控服務探得到就把 8212 對外開放。官方明講過這個介面不是設計來直接面向網際網路的,這筆交易是拿整台伺服器的管理權去換一個監控。心跳留在機器內部跑,往外送的只有那一行通知。
家用電腦有兩道過不去的上限
停電。 跳一次電就是一次 kill -9,而且有機會正好撞在寫存檔的那一秒。UPS 買到的是幾分鐘,這幾分鐘要花在「斷電時照順序降下去」才有意義——也就是要把 UPS 的監控程式接到上面那份停機腳本上。至於電回來以後機器會不會自己開,那不是作業系統的設定,是 BIOS 裡的電源回復選項。跟重開機一樣,這件事也得真的把插頭拔一次才算驗過。
浮動 IP。 家用線路的對外 IP 說變就變,一變,朋友存的那串 位址:連接埠 全部作廢。DDNS 可以讓一個網域名稱跟著跑,但《幻獸帕魯》用戶端存下來的是你當初打進去的字串,所以還是要全員重新填一次。再疊上路由器重開、上傳頻寬、電信端的位址共用,排查就會拉長,順序整理在連不上排查。
這兩件事都不是「設定調得更好」就能翻過去的。家用電腦撐幾天沒問題,要無人值守撐幾個月,每次卡住的都是它們。
常見問題
幻獸帕魯伺服器要怎麼做到 24 小時不關機?
把三件事分開做:enable systemd 單元,讓它開機自動啟動;單元裡寫 Restart=on-failure,讓它當機後自動重啟;再用 timer 或 cron 排一天一次的定時重啟。三件各擋一種狀況,只做其中一件,另外兩種狀況發生時它一樣是關著的。
伺服器當機後可以自動重啟嗎?
可以。單元的 [Service] 段寫上 Restart=on-failure 和 RestartSec=10,當機或被記憶體不足砍掉之後 10 秒會重新起來。[Unit] 段再加上 StartLimitIntervalSec=600 和 StartLimitBurst=5,每次都死在同一個原因上的伺服器就不會無限循環,10 分鐘內失敗 5 次就停下來。但這是爭取時間,不是解決原因;如果一天觸發好幾次,該查的是記憶體而不是重啟設定。
自動重啟設好了,伺服器卻沒回來,要看什麼?
先看 systemctl status palworld。出現「start request repeated too quickly」表示 10 分鐘內失敗了 5 次、systemd 放棄了,真正的原因在紀錄裡,修好之後用 sudo systemctl reset-failed palworld 清掉計數再啟動。狀態一直停在 activating (auto-restart) 的話,是少了 StartLimit 那兩行,正在無限重試。沒有錯誤只是安靜地 inactive,多半是正常結束,on-failure 本來就不會碰它——把腳本最後一行改成 systemctl restart 就好。
用家裡的電腦 24 小時開伺服器可以嗎?
撐幾天可以。時間拉長就會卡在停電和浮動 IP:停電是沒有預告的強制關閉,可能把存檔弄壞;對外 IP 一變,大家存的連線位址全部失效。兩件都不是設定能解決的,要長期常駐就需要一台電源和線路有人在維護的機器。
這三件事在託管上分別在哪
把三件事逐條搬過去,會是這樣。
第一件,開機自動啟動根本不再是一個步驟——機器和遊戲程式是一起託管的,沒有可以忘記 enable 的地方。第二件,程式當機由系統自動拉起。第三件,每日定時重新啟動在會員中心的「我的伺服器」進去的伺服器詳情頁上,就是一個開關加一個時刻;挑個安靜的時段設好,之後既沒有 timer 檔案,也沒有 Persistent 要判斷。
重啟前發生的事,跟這篇手寫的順序一模一樣:先在遊戲裡發全服公告,倒數計時走完先強制存檔,然後才停——也就是優雅停機。至於沒算進三件裡的第四件,知道它掉了,也在同一個頁面上:FPS 和線上人數每分鐘記錄一次,停掉的那一段線就是斷的,昨晚三點發生過什麼用看的就知道,不必去翻紀錄。
KeepWorlds 的《幻獸帕魯》專用伺服器上,這幾項就放在上面說的位置。就算你選擇自己架,要確認的清單也一樣:一次 enable、一行 Restart、一個 timer,再加一個知道它掉了的方法。四項都顧到,至少不會再落到「不知道為什麼是關著的」那種停法。
反過來,如果你的問題其實是「沒人在的時候世界有必要一直跑嗎」,那答案在自動暫停,以及它的代價。