SSH 斷線後 Xcode 建置畫面消失,您無法確定工作是否還在跑。
最快的處理方式:不要從斷線推斷建置結果;先重新連上遠端 Mac 檢查主機、程序與輸出。需要在終端離線後接回工作階段,就在遠端主機內使用 tmux,並於建置結束後核對日誌和結果檔。
適合:需要在不穩定網路下執行遠端 Xcode 長時間工作的人。不適合:期待 tmux 在主機重啟、程序遭終止或系統故障後自動續跑的人。
本文適合從個人開發到 CI 維運情境中,需要遠端執行 Xcode 建置或測試的工程師。
若您只想排查 SSH 無法登入,應先處理連線與主機可達性;本文聚焦的是「斷線後建置現在處於什麼狀態」。
為何 SSH 斷線不能直接代表建置停止或成功?
SSH 是用戶端與遠端主機之間的連線;xcodebuild 則是在主機上執行的命令列建置工具。連線中斷描述的是前者,不能單獨證明後者仍在執行、已經結束,或已成功產生結果。Apple 的 Xcode 命令列工具參考說明了命令列工具的用途,但不應據此推定 SSH 中斷時特定工作程序會如何處理。
先把問題拆成四個檢查點:
| 檢查項目 | 要確認的事 | 不足以單獨證明的事 |
|---|---|---|
| 遠端主機 | 目前是否能重新 SSH 登入同一台 Mac | 主機可登入,不代表建置仍在執行 |
| 建置程序 | 遠端是否仍有相關 xcodebuild 程序 |
程序存在,不代表最後會成功 |
| 工作階段 | tmux 工作階段是否仍可列出並接回 | 工作階段存在,不代表建置命令還沒結束 |
| 建置結果 | 日誌、退出狀態與預期產物是否符合專案驗收條件 | 終端畫面有輸出,不代表產物有效 |
常見的隱性問題不只一種:用戶端關閉終端、網路短暫中斷、命令收到終止訊號,以及遠端主機重啟,可能造成不同結果。磁碟空間不足也可能讓日誌或結果包無法完整寫入。單看連線恢復、程序清單或終端最後幾行,都不足以替代完整驗收。
重新登入後,怎樣逐項確認建置狀態?
第一步:確認登入的是原本的遠端 Mac
重新建立 SSH 連線後,先確認主機身分及專案目錄,再檢查工作階段。若不確定 SSH 設定或遠端開發環境是否正確,可先參考遠端 Mac 連線說明。重新登入到另一台主機,即使使用相同帳號,也看不到原主機上的程序與 tmux 工作階段。
第二步:檢查程序,但不要把程序存在當成成功
可在遠端主機執行:
pgrep -fl xcodebuild || true
若有符合項目,代表目前找到符合名稱的程序線索;再觀察它是否持續、檢查建置日誌,並確認它對應的是本次工作。若沒有符合項目,則建置可能已結束,也可能被中止,不能只靠這個結果判定成功或失敗。
終端機輸出與建置日誌也不是同一回事。終端畫面可能只保留部分滾動內容;若啟動命令時未將輸出寫入檔案,斷線後未必能從新連線重建完整紀錄。
第三步:查看 tmux 工作階段是否仍存在
如果原本是在 tmux 裡啟動建置,先列出遠端主機上的工作階段:
tmux ls
若清單中有先前建立的名稱,再接回該工作階段。tmux 官方入門說明與手冊描述了工作階段可脫離終端並重新接入的操作;這是終端工作階段的管理方式,不是主機或程序的備援機制。
第四步:確認命令退出狀態、日誌與產物
如果工作階段已接回,但建置命令已結束,檢查命令執行時保存的退出狀態、日誌尾端及專案要求的產物。若命令仍在執行,退出狀態還未產生,應繼續觀察,而不是將「尚未結束」當成成功。
若需要保留可供事後檢查的紀錄,可在啟動建置時把輸出導向指定檔案,並在命令結束後把退出狀態另行寫入檔案。例如:
xcodebuild \
-scheme "$SCHEME" \
-destination "$DESTINATION" \
-resultBundlePath "$RESULT_BUNDLE" \
> "$BUILD_LOG" 2>&1
rc=$?
printf '%s\n' "$rc" > "$EXIT_FILE"
這些變數要先依專案實際設定;路徑也應選在遠端主機上有寫入權限且空間足夠的位置。Apple 的命令列建置說明與測試結果說明可用來核對命令列建置與結果檢視方式。若要執行測試,也應依專案的測試計畫與驗收規則檢查結果,而非只看終端輸出。
tmux 如何讓您在 SSH 重新連線後接回工作?
以下操作必須在遠端 Mac執行。只在本機開啟 tmux 並不會替遠端建立可接回的工作階段;遠端主機也需要已安裝並能執行 tmux。若命令不存在,先按主機環境確認安裝方式;Apple 另有命令列工具安裝說明可供確認 Xcode 命令列工具的安裝需求。
先透過 SSH 登入,再建立命名工作階段:
tmux new -s xcode-build
在該工作階段內設定專案需要的環境,啟動建置命令。若要暫時離開而不關閉工作階段,按下 Ctrl-b,放開後再按 d;這會執行 detach。之後重新 SSH 登入同一台主機,再執行:
tmux attach -t xcode-build
若不確定工作階段名稱是否仍存在,先用 tmux ls 查詢,再選擇對應的名稱接回。建置結束後,依前述方法核對退出狀態與結果檔;單純接回 tmux,只能確認工作階段可重新顯示,不能替建置結果背書。
兩種啟動方式的差異,會直接影響斷線後能否重新取得原本的終端畫面:
| 啟動方式 | SSH 用戶端離線後的處理方向 | 主要限制 |
|---|---|---|
| 直接在 SSH 終端執行 | 重新登入後檢查程序、日誌與結果;原終端畫面未必能接回 | 是否繼續執行不能預設,需在目標環境核對 |
| 在遠端 tmux 工作階段執行 | 重新登入後列出並 attach 原工作階段 | 不負責主機重啟後自動啟動,也不保證程序或資料存活 |
tmux 無法接回時,該如何決定下一步?
若 SSH 無法登入,先處理遠端主機的可達性;若主機能登入但找不到 tmux 工作階段,再查看建置程序、日誌與結果檔。若程序不存在且結果不完整,應依專案建置流程判斷是否重跑,而不是假設工具能從中斷位置續建。
尤其要分清楚 tmux 能處理與不能處理的狀況:它管理可脫離終端的工作階段,方便稍後重新接入;它不等於程序持久化、開機自動續跑或斷點續傳。主機重啟、程序遭終止或系統故障時,原工作可能已經消失。這時先檢查主機狀態、系統紀錄、磁碟空間與已寫入的產物,再決定修復環境或重新執行。
依條件選擇處理方式:
- 若建置是在遠端 tmux 工作階段啟動,而且該工作階段仍存在:attach 回去,檢查命令狀態、日誌與產物。
- 若工作階段不存在,但主機可登入:檢查
xcodebuild程序及已保存的輸出;依實際結果判斷建置仍在執行、已結束或需要重跑。 - 若主機無法登入:先確認主機是否可用,不要把 SSH 失敗直接判成建置失敗。
- 若主機曾重啟、程序已結束或結果檔不完整:把原工作視為未完成,先檢查環境與資料,再依專案流程重新建置。
常見問題
SSH 連線中斷時,遠端的 xcodebuild 一定會結束嗎?
不一定。SSH 中斷只說明用戶端與遠端主機之間的連線失效;建置是否繼續,要依啟動方式和主機上的實際狀態確認。重新登入後檢查程序、日誌及結果檔,不能只憑能否重新連線判斷建置狀態。
怎樣在遠端 Mac 用 tmux 保留 Xcode 建置工作階段?
登入遠端 Mac 後,在該主機建立命名的 tmux 工作階段,再於其中執行建置。要離開時 detach,稍後重新 SSH 登入後列出工作階段並 attach。請確認 tmux 是在遠端執行,而不是只在本機終端啟動。
重新 SSH 登入後,如何接回正在執行的建置?
先確認登入的是原本的主機,再用 tmux ls 查詢工作階段。若找到原工作階段,使用相符名稱接回;若找不到,改查建置程序、日誌及產物。這些檢查的目的,是分辨工作仍在執行或已結束,不是讓已終止的程序重新開始。
斷線期間的 Xcode 建置要怎麼確認成功或失敗?
查看保存下來的命令退出狀態、建置日誌,以及專案預期的結果包或產物。程序仍存在時,建置可能尚未結束;程序消失時,也不能因此推定成功。若結果或日誌不完整,依專案驗收方式判斷是否需要重跑。
為需要的建置工作準備合適的 Mac 環境
若目前用本機筆電跑建置,工作會受該設備是否開機、網路是否穩定及本機可用資源影響;購買專用 Mac 則需要先投入硬體成本,也要自行安排維護。Linux 伺服器可執行許多工作,但不能取代需要 Xcode 與 macOS 工具鏈的建置環境。
需要 macOS 建置環境、又不打算購買專用設備時,可先按專案流程驗證遠端 Mac 的工具鏈、日誌保存與結果驗收方式;若只是短期或階段性使用,可再查看 HopVM 遠端 Mac 租用方案。若工作需要長期固定負載或實體裝置介面,則應先評估自有設備是否更符合需求。
常見問題
SSH 連線中斷時,遠端的 xcodebuild 一定會結束嗎?
不一定。SSH 只反映用戶端與遠端主機之間的連線;建置程序是否繼續,還取決於啟動方式、工作階段狀態及主機狀況。重新登入後,請在遠端主機檢查相關程序、日誌和結果檔案,不要只憑 SSH 重新連得上,就判定建置仍在執行或已成功。
怎樣在遠端 Mac 用 tmux 保留 Xcode 建置工作階段?
先透過 SSH 登入遠端 Mac,再於該主機建立命名的 tmux 工作階段,並在裡面啟動建置。要暫時離開時使用 tmux 的 detach 操作;稍後重新登入後,以該工作階段名稱 attach。這能讓終端工作階段脫離用戶端連線,但不會保證主機重啟後自動續跑。
重新 SSH 登入後,如何接回正在執行的建置?
先確認 SSH 登入的是原本那台遠端 Mac,再列出 tmux 工作階段並接回正確名稱。若找不到工作階段,另行檢查 xcodebuild 程序與日誌;它可能已結束、被終止,或主機狀態已改變。不要另開同名建置來「接續」,否則可能造成重複工作或覆寫結果。
斷線期間的 Xcode 建置要怎麼確認成功或失敗?
確認建置程序已結束後,查看啟動命令保存的退出狀態、完整建置日誌,以及預期的結果包或產物。終端畫面仍有舊輸出,不代表建置成功;程序清單中看不到 xcodebuild,也不等於已產生有效結果。若日誌或結果檔不完整,應依專案流程判定需要重跑或進一步查錯。
延伸閱讀
讓 Xcode 建置留在獨享遠端 Mac 上執行
HopVM 提供獨享 Apple Silicon 實體 Mac,SSH 中斷後可重新連線檢查主機、建置程序與結果檔案。
