蘋果環境

遠端桌面

Jump Desktop 與睡眠依電源切換

把 MacBook 放在家裡,人在外面時用 Jump Desktop 連回來。插電時連闔蓋都不睡,隨時可遠端;用電池時恢復正常睡眠。

一鍵安裝

本篇的設定步驟也寫成了腳本:install.sh。執行前請先閱讀檔案開頭的說明,裡面列出會檢查哪些項目、哪些步驟需要手動處理。

curl -fsSL -o /tmp/remote-desktop-install.sh https://oawu.tw/blog/macos/remote-desktop/files/install.sh
bash /tmp/remote-desktop-install.sh
  • 腳本本身不改動系統,只檢查做到哪一步。安裝 Jump、睡眠設定、自動切換服務都要管理員密碼,腳本會印出指令後停下,在終端機 App 執行完再跑一次即可
  • 權限與帳號偵測不到 - 登入 Jump 帳號、「螢幕與系統錄音」「輔助使用」權限,完成時會列出來提醒,要自己確認
  • 可重複執行,已完成的步驟會略過。全部設定好之後再跑,只會做檢查

這篇在做什麼

電源闔蓋時能不能遠端
插電不睡可以
電池正常睡眠不行

用電池時不能遠端是刻意的取捨 - 闔蓋放進包包還不睡,會在不通風的地方持續運作,高溫是電池老化的主因。

家裡(被控端)                               外面(控制端)
MacBook,闔蓋、接外接螢幕                    另一台 Mac 或 iPhone
  Jump Desktop Connect(免費)               Jump Desktop
        │                                          │
        └──────────── Jump 的中繼伺服器 ───────────┘

選 Jump Desktop 的原因:畫質好、買斷制、有手機版、沒有連線時間限制,而且走 Jump 的中繼伺服器,家裡不用開 port。

被控端:安裝 Jump Desktop Connect

  • 官網 - https://jumpdesktop.com/connect/
  • 安裝:brew install --cask jump-desktop-connect(會要求輸入管理員密碼,請在終端機 App 執行)
  • 開啟 Jump Desktop Connect ❯ 登入 Jump 帳號,控制端要登入同一個帳號

❗️ 我是用 Sign in with Apple 登入的,重灌後也要用同一種方式登入。改用 Google 或另外註冊,會變成另一個帳號,兩邊互相看不到。

裝完會註冊兩個開機項目:com.p5sys.jump.connect.service(以 root 執行,讓它在登入畫面也能接受連線)與 com.p5sys.jump.connect.agent。預設會在背景自動更新,常駐對外的程式建議保持開著。

被控端:授權

  • 開啟系統設定(option + F10)❯ 隱私權與安全性
  • 螢幕與系統錄音 - 打開 Jump Desktop Connect
  • 輔助使用 - 打開 Jump Desktop Connect

❗️ 沒開的話,連進來是黑畫面或無法操作。這兩個權限只能在機器前面點,搬到家裡之前一定要完成並實測一次。

被控端:睡眠設定

macOS 有兩種睡眠

類型觸發條件pmset sleep 0pmset disablesleep 1
閒置睡眠一段時間沒人操作✅ 擋得住✅
闔蓋睡眠蓋子闔著,且沒有啟用中的外接螢幕❌✅

caffeinate 也只擋閒置睡眠,對闔蓋無效。

「啟用中」是關鍵 - 線有接不算,要 macOS 認為它是啟用狀態。外接螢幕因任何原因消失(被軟體停用、斷電、線鬆、螢幕進入深度省電),闔著蓋子的 MacBook 就會睡著,從外面就連不上了。

閒置睡眠:只改插電時

sudo pmset -c sleep 0 displaysleep 10 disksleep 0
  • -c 只改插電時(AC),電池那組不動,照常省電
  • displaysleep 10 - 螢幕照常會關

闔蓋睡眠:依電源自動切換

擋闔蓋睡眠要靠 disablesleep 1,但它(pmset -g 裡的 SleepDisabled)是全域開關,-c/-b 分不了電源:pmset -g custom 的 AC 與 Battery 兩區裡都沒有這一項。

所以寫了一個 LaunchDaemon,每 15 秒看一次電源,插電切成 1、用電池切成 0,數值相同時什麼都不做:

檔案安裝位置用途
sleep-by-power.sh/usr/local/sbin/讀 pmset -g ps 判斷電源,與目前值不同才切換
tw.oawu.sleep-by-power.plist/Library/LaunchDaemons/以 root 執行,StartInterval 15、RunAtLoad
install-sleep-by-power.sh-安裝,三個檔案要放在同一個目錄
/var/log/sleep-by-power.log-只在切換時寫一行

安裝:

mkdir -p /tmp/remote-desktop && cd /tmp/remote-desktop
for f in sleep-by-power.sh tw.oawu.sleep-by-power.plist install-sleep-by-power.sh; do
  curl -fsSLO https://oawu.tw/blog/macos/remote-desktop/files/$f
done
sudo bash install-sleep-by-power.sh
  • 安裝時 macOS 可能跳出「已加入背景項目」,在系統設定 ❯ 一般 ❯ 登入項目與延伸功能 裡要保持允許
  • 腳本會複製到 root 擁有的 /usr/local/sbin 再執行,不直接執行下載的那份 - root 執行的服務若讀的是一般使用者改得到的檔案,任何程式都能藉此取得 root 權限
  • 改了腳本內容,要重新執行一次安裝才會生效

實測拔電約 10 秒切成 0、插電約 4 秒切回 1,紀錄長這樣:

2026-10-13 20:16:13 電源:電池 → disablesleep 0(原本 1)
2026-10-13 20:18:14 電源:AC → disablesleep 1(原本 0)

控制端

控制端用哪個版本
iPhone、iPadJump Desktop iOS 版
Apple Silicon(M 系列)的 MaciOS 版也能跑,在 Mac App Store 搜尋後切到「iPhone 與 iPad App」分頁下載,與手機共用一份
Intel 的 Mac只能買 Mac 原生版

開啟後登入同一個 Jump 帳號,家裡那台就會出現在清單裡。

連線設定兩件事:

  • 顯示模式設為 Host Displays - 不要用虛擬顯示器(Single Virtual Display),原因見下方〈補充〉
  • 存好家裡那台的使用者名稱與密碼 - 沒存的話,每次連線第一下會送出空白帳密、認證失敗一次

驗證

驗證指令預期
闔蓋睡眠的開關pmset -g | grep SleepDisabled插電 1、電池 0
自動切換服務launchctl print system/tw.oawu.sleep-by-power | grep "last exit code"0
切換紀錄cat /var/log/sleep-by-power.log每次插拔電源一行
闔蓋會不會睡ioreg -r -k AppleClamshellState -d 4 | grep CausesSleepNo
最近有沒有睡著過pmset -g log | awk '$4=="Sleep"' | tail -5沒有新的 Clamshell Sleep
有人連進來tail "/Library/Logs/Jump Desktop/access.log"Authentication Succeeded

實測一次(機器還在身邊時做):

  1. 闔上蓋子
  2. cmd + ctrl + q 鎖定、按 esc 關螢幕
  3. 不要碰它,等 5 分鐘以上
  4. 從另一台連線並解鎖,連線期間也不要碰家裡那台

連入時會先看到鎖定畫面,輸入 macOS 密碼就會回到原本的桌面。

注意事項

  • 不要手動執行 pmset -a disablesleep - 服務 15 秒內會改回來
  • 拔電後最多 15 秒才切換 - 闔蓋放包包前想確認的話,pmset -g | grep SleepDisabled 要是 0
  • 停電時會切成 0 而睡著,來電後不會自己醒,要等有人叫醒它才能遠端。這是刻意的,沒有另外設定 acwake
  • 長期插電要開「最佳化電池充電」(系統設定 ❯ 電池 ❯ 電池健康度 ⓘ),讓電池大多停在 80%
  • pmset -g 顯示的 sleep prevented by … 不代表設定生效 - 那只是列出目前有哪個程式暫時擋著睡眠(例如 LINE),程式一關就會睡。要看的是 SleepDisabled 與 sleep 的數值本身
  • 重灌會清掉這些設定,macOS 大版本更新後也建議重跑一次一鍵安裝腳本檢查

補充:外接螢幕突然黑掉、重插也沒用

原因

Jump 的虛擬顯示器(顯示選單的 Single Virtual Display)是讓沒接螢幕的 Mac 也有畫面可傳。建立虛擬顯示器時,它一定會停用實體螢幕,斷線時應該恢復,但實際上會恢復失敗。而控制端會記住顯示模式,之後每次連線都會再停用一次。

連鎖後果:

外接螢幕被停用 → 黑畫面,重插也沒用
               → 闔蓋 + 沒有啟用中的外接螢幕 → 闔蓋睡眠
               → 從外面連不上

重插沒用是因為 macOS 記得這台螢幕是「已停用」,重新插上不會觸發任何顯示器變更。

判斷是「沒接上」還是「被停用」

下載 displays.swift 列出 macOS 認得的顯示器:

swift displays.swift                              # 看不到外接螢幕
ioreg -lw0 | grep -o '"ProductName" = "[^"]*"'    # 但硬體層讀得到 → 是被停用

救回

  1. 找出被停用的螢幕編號:
    grep "Disabling physical display" ~/Library/Logs/Jump\ Desktop/Agent_*.log
    Disabling physical display 3 (uuid …) 裡的 3 就是編號
  2. 下載 enable-display.swift 重新啟用:
    swift enable-display.swift 3
    輸出的三個數值都是 0 才算成功
  3. 登出或重新開機也會恢復

預防

控制端的顯示模式改回 Host Displays。

紀錄檔位置

檔案內容
/Library/Logs/Jump Desktop/access.log每次連入、認證、斷線
/Library/Logs/Jump Desktop/Service_*.logroot 服務
~/Library/Logs/Jump Desktop/Agent_*.log擷取畫面、虛擬顯示器

路徑裡的 Jump Desktop 有空格,記得加引號或跳脫。

移除與還原

帶出門不需要做任何事,拔電後服務會自動切成允許睡眠。

暫時停用自動切換(重開機後會再載入):

sudo launchctl bootout system/tw.oawu.sleep-by-power

移除自動切換,並把 SleepDisabled 固定成指定值,用 uninstall-sleep-by-power.sh:

curl -fsSL -o /tmp/uninstall-sleep-by-power.sh https://oawu.tw/blog/macos/remote-desktop/files/uninstall-sleep-by-power.sh
sudo bash /tmp/uninstall-sleep-by-power.sh 0   # 0=正常睡眠;1=永遠不睡

完全放棄遠端、回到原本的狀態,再加上:

sudo pmset -c sleep 1 disksleep 10
brew uninstall --cask jump-desktop-connect

相關參考