故障排查
讀完本頁,你就能讀懂命令失敗時 lip 告訴你的內容,找到它的失敗報告,並解決最常見的幾種失敗。
讀懂失敗資訊
命令失敗時,lip 會在終端機裡輸出三樣東西:
error: There is no server to run: 'D:\servers\survival\bedrock_server_mod.exe' is not a file, though the workspace has the game bds 1.26.60 with a loader. It may have been deleted or moved by hand. lip does not install a package again that is installed in the same version, so setting up the same versions here does not bring the file back. Restore it from a backup, or run 'lip setup --game 1.26.60 --loader levilamina@26.60.3' in an empty folder and copy the file from there.
Full report: .lip\logs\20261114T201502Z-4120.logerror:出了什麼問題。如果一個問題是由另一個問題引起的,每個原因會各佔一行,以caused by:開頭。hint:你可以怎麼辦。提示可能有好幾條,也可能沒有。Full report:一個檔案,裡面是 lip 對這次失敗所知道的一切。
先看錯誤和提示。大多數時候這就夠了。
介面會在對話方塊裡顯示同樣的內容:
失敗報告
- 位置: 執行命令時所在資料夾裡的
.lip/logs/。在介面裡,是目前工作區裡的。 - 名字: 失敗的時間(UTC)加上 lip 處理程序的編號,例如
20261114T201502Z-4120.log。 - 數量: lip 保留最新的 20 份,更舊的會被刪除。
- 格式: 純文字。用任何編輯器都能開啟。
一份報告有五個部分:
| 部分 | 內容 |
|---|---|
Environment | 時間、lip 的版本、命令、資料夾、你的系統、設定目錄和快取目錄、命令是否由常駐程式執行,以及已設定的代理伺服器變數。 |
Error | 錯誤和提示,與終端機裡顯示的一樣。 |
Exception | 錯誤的完整技術細節。 |
Workspace (.lip) | .lip 裡有什麼;如果有被中斷的操作,還有它的日誌。 |
Trace | lip 一步步做了什麼:網路請求、考慮過的版本、改動的檔案,以及套件的程式的輸出。 |
URL 裡的密碼和令牌(例如代理伺服器的)會被取代成 ***。即便如此,分享之前還是請看一遍:裡面有你的資料夾名和套件名。
有些失敗不會寫報告:
- 命令行寫錯了,例如用了不存在的選項。lip 會說明問題,並加上一句
Run lip --help to see how to use lip. - 你取消了命令。 lip 會輸出
Cancelled. Any changes to the workspace were undone. - 伺服器執行了一陣後失敗。
lip run只是把伺服器的結束代碼傳出來,不會加任何東西。請看伺服器自己的輸出。
如果報告本身寫不進去,例如磁碟是唯讀的,lip 會改為在終端機裡輸出其中最重要的部分。
尋求幫助
如果錯誤和提示幫不上忙,請在 https://github.com/LiteLDev/lip/issues 提交 issue,並附上報告。如果某條提示說 This looks like a bug in lip,請務必這樣做:那是我們的問題,不是你的。
另一個 lip 正在變更工作區
error: lip cannot take the workspace lock 'D:\servers\survival\.lip\lock': most likely another lip command is changing the workspace 'D:\servers\survival'. Wait for the other lip command to finish, then try again. If no other lip command is running, a program may be holding the lock file open: close it, then try again.同一時間只能有一條命令變更一個伺服器資料夾。有 lip setup、lip install、lip update 或 lip uninstall 正在那裡工作,或者介面正在那裡應用變更時,第二條命令不會等待:它立刻失敗,什麼都不改。
lip run 也可能這樣失敗。在啟動伺服器之前,以及每次自動重新啟動之前,它都要檢查資料夾裡有沒有被中斷的變更,那一刻它需要同一把鎖。
怎麼辦:
- 等另一條命令結束,再執行你的命令。看看其他終端機,如果介面開著也看一下。
- 如果沒有 lip 在工作,那就是別的程式開啟著
.lip/lock檔案。備份工具、同步工具和編輯器都可能這樣做。關掉它再試。
你永遠不需要刪除 .lip/lock。鎖不是這個檔案本身,而是對它的佔用;持有它的 lip 一結束,佔用就自動解除,即使它是當機的。
唯讀的命令(例如 lip list)和所有試執行都不加鎖,絕不會這樣失敗。
檔案被佔用
hint: A file is in use by another program. Stop the server and other programs that use the workspace, then try again.這發生在 Windows 上:執行中的程式會一直開啟它的檔案,誰也沒法取代或刪除它們。最常見的情況是這個程式就是伺服器本身:你在它執行時變更了套件,而 lip 必須取代的檔案屬於執行中的遊戲或已載入的模組。
lip 已經復原了它的變更。工作區和之前一樣。
怎麼辦:
- 停止伺服器。 在它的終端機裡按 Ctrl+C,或者在介面的伺服器頁面選擇「停止」。
- 關閉其他開啟著該資料夾裡檔案的程式,例如正在編輯設定檔的編輯器。
- 重新執行命令。
如果 lip 還說了 Some changes could not be undone,說明某個檔案被佔用得太死,lip 連放回去都做不到。同樣按這三步做。之後在這個資料夾裡的下一次 lip install、lip update、lip uninstall 或 lip setup 會先完成清除,再做別的事。見當機或斷電之後。
介面不會遇到這種情況:工作區的伺服器執行期間,它不變更那裡的套件。
連不上 GitHub
lip 的大多數套件都從 GitHub 下載。提示會告訴你遇到的是哪一類問題:
| 提示的開頭 | 含義 | 怎麼辦 |
|---|---|---|
lip could not reach the server. | 完全沒有回應:沒有網路,或者 GitHub 被屏蔽、非常慢。 | 檢查網路連線。然後見 GitHub 很慢或被屏蔽時。 |
The server refused the request, possibly because too many requests were sent. | GitHub 或你的代理伺服器限制了下載次數。 | 等幾分鐘再試。 |
The repository or file does not exist, or is private. | 名字寫錯了,或者儲存庫不是公開的。 | 檢查名字和版本有沒有拼錯。lip 只從公開儲存庫安裝。 |
The server had a problem. | GitHub 或對方網站出了問題。 | 稍後再試。 |
A file that <package> <version> publishes is missing from where its package file says it is | 套件指向的下載地址已經失效。 | 用 <package>@<version> 安裝別的版本,並告訴套件的作者。 |
如果你設定了 GitHub 代理伺服器,而錯誤資訊說代理伺服器不支援 git 儲存庫,那麼這個代理伺服器做不到 lip 需要的事。用 lip config delete github_proxy 移除它,或者換一個。
介面啟動時會檢查 GitHub。連不上而你又還沒做過選擇時,它會問你是設定代理伺服器、直接連線,還是以後再說。
伺服器無法啟動
lip run 或介面裡的「啟動」在伺服器執行起來之前就失敗了。請在下面找到你看到的資訊。
There is no server to run: this workspace has no game.
這個資料夾還沒有安裝伺服器,或者你進錯了資料夾。進入伺服器資料夾,或者安裝一個:lip setup --game <version>。見安裝伺服器。
A server of the workspace '…' is already running
這個資料夾裡已經有伺服器在執行,而一個資料夾同一時間只執行一個伺服器。找到它,在它所在的地方停止它:
- 它可能執行在另一個終端機裡,由
lip run啟動。在那裡按 Ctrl+C。 - 它可能是託管伺服器,由介面或
lip run --managed啟動。執行lip run --managed接入它,再按 Ctrl+C。或者在介面的伺服器頁面選擇「停止」。
在介面裡,對於不是它啟動、它也控制不了的伺服器,伺服器頁面會顯示在此介面之外執行:比如由普通的 lip run 啟動的伺服器,或者這臺機器上另一個使用者執行的伺服器。介面無法停止它,也無法顯示它的輸出。請在啟動它的地方停止它。
There is no server to run: '…' is not a file
資料夾已經安裝了伺服器,但伺服器的程式不見了。它可能被手動刪除或移走,或者被安全軟體清除了。在這個資料夾裡重新安裝同樣的版本並不能把它找回來:已經安裝的套件,lip 不會再安裝一遍同一個版本。請從備份中恢復這個檔案。沒有備份時,在一個空資料夾裡執行錯誤資訊中給出的 lip setup 命令,再把缺少的檔案從那裡複製到這個資料夾。你也可以乾脆換到那個新資料夾:在那裡安裝你的模組,再把舊資料夾裡的 worlds/、server.properties、allowlist.json、permissions.json 和模組的設定複製過去。
The game of this workspace is the Linux server … which lip runs only on Linux on x64.
到 x64 的 Linux 上執行它,或者改裝 Windows 伺服器:lip setup --game <version> --build windows。見 Linux 與 macOS。
The Microsoft Visual C++ Redistributable was not installed: Windows did not allow its installer to run as an administrator.
Windows 伺服器需要它,而 Windows 詢問時你選了「否」。重新執行命令並允許它,或者自己從 https://aka.ms/vc14/vc_redist.x64.exe 安裝。
Rosetta 2 is not installed
在 Apple 芯片的 Mac 上執行 softwareupdate --install-rosetta --agree-to-license,然後重新執行 lip。
lip run --managed needs the daemon of lip
見 lip 自己執行了命令。
伺服器啟動後又結束了。
這是伺服器自己失敗了,不是 lip。lip run 以伺服器的結束代碼結束,不寫報告。請看伺服器最後輸出的幾行。常見原因有:連接埠被別的程式佔用、世界損壞、某個模組載入失敗。要檢查是不是最後一種,可以解除安裝你最近安裝的模組試試。
如果 restart 是 on-failure 而伺服器一再失敗,lip 在 10 分鐘內重新啟動 5 次後就不再嘗試:
⚠ The server exited with code 1. lip restarted it 5 times within 10 minutes, so it does not restart it again. Look at what the server wrote above for why it fails.常駐程式是另一個版本
lip 的工作是在背景處理程序(常駐程式)裡完成的,第一條命令會啟動它。更新 lip 之後,舊版本的常駐程式可能還在執行。
多數時候你不會察覺。新的 lip 會請舊的常駐程式結束;它空閒時就會結束,然後新的常駐程式啟動。
正忙著的舊常駐程式會留下:它正在執行某條命令,或者正在執行託管伺服器。這時新的 lip 會說:
lip could not have its daemon carry out the command (the daemon of lip 0.41.0 that runs carries out a command or runs a managed server); it carries it out itself.你的命令照樣能完成。想換到新的常駐程式:
-
看看在執行什麼:
lip daemon status。textThe daemon of lip 0.41.0 runs as process 4120, carrying out 0 commands. -
停止託管伺服器。對每一個,在它的資料夾裡執行
lip run --managed並按 Ctrl+C,或者在介面裡停止它。為此,lip run --managed仍然會使用舊的常駐程式。 -
執行
lip daemon stop。下一條命令會啟動新的常駐程式。
常駐程式忙碌時,lip daemon stop 會拒絕並說明原因。它絕不會替你停止伺服器。
lip 自己執行了命令
lip could not have its daemon carry out the command (<reason>); it carries it out itself.lip 沒能啟動或連上它的常駐程式,於是改由你啟動的這個處理程序來完成工作。這是一種回退,不是失敗:命令做的事是一樣的。
沒有常駐程式時,有兩點不同:
lip run --managed會失敗。 託管伺服器存在於常駐程式裡。請用普通的lip run執行伺服器,或者先解決常駐程式的問題。- 介面不能讓伺服器持續執行。 你在介面裡啟動的伺服器,會在你結束介面時停止。結束時介面會告訴你。
括號裡的原因說明了問題所在:
| 原因 | 怎麼辦 |
|---|---|
the daemon of lip <version> that runs carries out a command or runs a managed server | 見常駐程式是另一個版本。 |
the daemon that lip started did not listen within 10 seconds、the daemon that lip started does not listen | 常駐程式沒能啟動。重新執行命令。如果一直這樣,請連同 lip daemon status 的輸出一起反饋。 |
the daemon keeps exiting、the daemon keeps being replaced | lip 連線時,常駐程式連續多次結束或被取代。同時使用兩個版本的 lip 時會這樣。只用一個版本,再重新執行命令。 |
| 系統給出的資訊,例如拒絕訪問 | 在 Linux 和 macOS 上,檢查你能否寫入套接字所在的目錄:$XDG_RUNTIME_DIR/lip;該變數未設定時是 ~/.local/state/lip。 |
另一條不同的資訊 lip: the daemon ended before the command did. 表示常駐程式在為你工作時被殺掉了。重新執行命令。如果它當時正在變更工作區,那裡的下一條命令會先做清除。
當機或斷電之後
如果 lip 在命令變更伺服器資料夾的過程中被殺掉,或者機器斷電,這次變更就停在了一半。lip 對此有準備。變更檔案之前,它會先把這次變更記在 .lip/journal 裡,並把每個檔案的舊版本留在旁邊,直到整條命令做完。
你不需要做什麼特別的事。在那個資料夾裡的下一次 lip setup、lip install、lip update、lip uninstall 或 lip run 會先把事情理順,並告訴你是哪種情況:
⚠ A lip operation on this workspace was interrupted (it started at <time>); undid its <n> changes. The workspace and its state file are as they were before it.被中斷的命令還沒做完,所以 lip 把它撤回了。請重新執行那條命令。
Finished an interrupted lip operation that had completed (it started at <time>): deleted the backups it left.被中斷的命令只差清除沒做,所以 lip 替它做完了。不需要重做什麼。
如果 lip 沒法把某個檔案放回去,例如伺服器正開啟著它,lip 會失敗、列出這些檔案,並保留日誌。停止伺服器和使用該資料夾的程式,再執行上述任意一條命令。它會從停下的地方繼續。
DANGER
不要刪除 .lip/journal;日誌還在的時候,也不要刪除伺服器資料夾里名為 .<名字>.bak 的檔案。lip 要靠它們來恢復。
試執行,以及介面在你應用之前顯示的計劃,只會提到有操作被中斷。它們不會修復它。
清除快取
lip 把下載的東西放在快取裡,這樣同一個檔案不會下載兩次。快取只是為了省時間。刪掉它不會丟失任何東西。
lip cache clean✓ Cache cleaned successfully.這些時候可以清除:
- 需要磁碟空間。 遊戲的下載檔案很大。
- 某個下載似乎壞了,同一個安裝一再失敗。lip 本來就會取代快取裡不是有效 ZIP 壓縮檔的檔案,所以很少需要這樣做。
別的 lip 命令正在下載時不要清除:那條命令可能會失敗。之後重新執行它即可。
你的伺服器、你的設定和 lip 的 Wine 都不在快取裡,不受影響。在介面裡,同樣的功能是設定頁面的「清除快取」。
其他資訊
| 提示 | 怎麼辦 |
|---|---|
lip is not allowed to access a file. | 檢查檔案是不是唯讀的,以及你的使用者能否寫入伺服器資料夾。 |
The disk is full. | 騰出一些空間(例如用 lip cache clean),然後再試。 |
A hook command of a package failed. | 某個套件在安裝或移除過程中執行的程式失敗了。它的輸出在錯誤資訊上方,也在報告的 Trace 部分。這是套件的問題:請向套件的作者反饋。 |
Run lip in an interactive terminal. | lip 需要問你一些事,但它的輸入或輸出不是終端機,問不了。如果是 Minecraft EULA,請加上 --accept-eula。 |
The game of this workspace is <version>, with LeviLamina <version>; lip install does not change them. | 你要安裝的套件與你的遊戲或載入器不兼容。錯誤資訊會指出是哪些。請安裝它們的其他版本,或者變更遊戲:見變更遊戲版本。 |
Request other versions of the packages named above, or install fewer of them together. | 你要安裝的套件彼此不兼容。錯誤資訊會指出是哪些。請安裝它們的其他版本,或者少裝幾個。 |
檔案都在哪裡
知道 lip 把東西放在哪裡,有助於查找問題。
| 內容 | 位置 |
|---|---|
你的伺服器:遊戲、世界、server.properties、模組 | 伺服器資料夾本身 |
| lip 對這個資料夾的瞭解:已安裝的套件、鎖、日誌、失敗報告、Wine 前綴、工作區設定 | 伺服器資料夾裡的 .lip/。在 Windows 上是隱藏的。 |
| 你的設定 | Windows 上是 %APPDATA%\lip,其他系統上是 ~/.config/lip |
| 快取 | Windows 上是 %LOCALAPPDATA%\lip\Cache,其他系統上是 ~/.cache/lip |
| lip 的 Wine | Linux 和 macOS 上是 ~/.local/share/lip |
| 介面的工作區清單 | Windows 上是 %LOCALAPPDATA%\lip\State,其他系統上是 ~/.local/state/lip |
每個檔案和目錄的說明見檔案和目錄。