7×24 服务器

把 Mac mini 当成
7×24 小时服务器

Mac mini 默认按桌面电脑的习惯工作:会休眠、断电后不自动开机、重启后停在登录界面。当它在远处当服务器用时,这些默认值都要改。本文按顺序处理防休眠、断电自启、FileVault 与自动登录、launchd 守护进程,以及远程重启后如何确保能连回来。

三万主机 · 更新于

01 / SLEEP

防止休眠

图形界面:「系统设置 → 能耗」,打开「显示器关闭时防止自动进入睡眠」,并打开「通过网络访问唤醒」。命令行(需要管理员权限):

sudo pmset -a sleep 0          # 系统不休眠
sudo pmset -a disksleep 0      # 磁盘不休眠
sudo pmset -a displaysleep 10  # 显示器可以关,不影响服务
sudo pmset -a womp 1           # 允许网络唤醒
pmset -g                       # 查看当前设置

只想临时保持清醒,可以用 caffeinate -dimsu 或 caffeinate -i 某个命令,命令结束后恢复默认。

02 / POWER

断电后自动开机

停电恢复后让机器自动开机,以及系统卡死时自动重启:

sudo pmset -a autorestart 1
pmset -g | grep autorestart      # 确认为 1
sudo systemsetup -setrestartfreeze on

图形界面里对应「系统设置 → 能耗 → 断电后自动启动」。如果放在自己家里,建议配一个小型 UPS,减少短暂断电造成的重启次数。

03 / LOGIN

自动登录与 FileVault 的冲突

有些任务必须在用户登录后才能运行,例如依赖图形界面的程序、iOS 模拟器、使用登录钥匙串的签名任务。这时会想打开自动登录(「系统设置 → 用户与群组 → 自动以此身份登录」)。但只要 FileVault 是开着的,macOS 就不允许自动登录,这个选项会是灰的。

  • 保留 FileVault(更安全):服务尽量写成 LaunchDaemon,不依赖用户登录;计划内重启用 fdesetup authrestart。
  • 关闭 FileVault 换取自动登录:磁盘不再加密,适合不存敏感数据的构建机,需要你自己评估。
fdesetup status                 # 查看 FileVault 状态
sudo fdesetup authrestart       # 重启,下次开机自动完成一次 FileVault 认证
04 / LAUNCHD

用 launchd 托管服务

macOS 上不用 systemd,后台服务交给 launchd。下面是一个开机即运行、崩溃后自动拉起的守护进程,放在 /Library/LaunchDaemons/com.example.api.plist,属主为 root、权限 644:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0"><dict>
  <key>Label</key><string>com.example.api</string>
  <key>UserName</key><string>svc</string>
  <key>ProgramArguments</key><array>
    <string>/Users/svc/app/bin/server</string>
  </array>
  <key>WorkingDirectory</key><string>/Users/svc/app</string>
  <key>RunAtLoad</key><true/>
  <key>KeepAlive</key><true/>
  <key>StandardOutPath</key><string>/Users/svc/logs/api.log</string>
  <key>StandardErrorPath</key><string>/Users/svc/logs/api.err</string>
</dict></plist>
sudo chown root:wheel /Library/LaunchDaemons/com.example.api.plist
sudo launchctl bootstrap system /Library/LaunchDaemons/com.example.api.plist
sudo launchctl print system/com.example.api | head -20     # 查看状态
sudo launchctl kickstart -k system/com.example.api         # 重启服务

launchd 的环境变量很少,PATH 不包含 Homebrew 目录。程序路径写绝对路径,或者在 plist 里用 EnvironmentVariables 补上。

几个容易踩的坑:UserName 指定的用户要真实存在,并对工作目录和日志目录有写权限;KeepAlive 为真时,程序如果启动后立刻退出,launchd 会按节流间隔反复拉起,日志会迅速变大,先手动运行确认程序能常驻;修改 plist 后要先 sudo launchctl bootout system/com.example.api 卸载再重新 bootstrap,单纯 kickstart 不会读取新配置。

05 / REBOOT

远程重启后的连接恢复

远程重启前先确认三件事:「系统设置 → 通用 → 共享」里「远程登录」(SSH)已打开;需要的服务都已经是 LaunchDaemon 或会自动启动;FileVault 状态你心里有数。

  • SSH 在登录界面阶段就可用,不需要有人登录图形界面。
  • Tailscale、内网穿透等工具如果只装了需要用户登录才启动的版本,重启后会连不上,应换成能以系统服务运行的方式,参见 用 Tailscale 接入远程 Mac。
  • 住宅宽带的公网 IP 可能变化,靠 IP 直连时要配 DDNS,或者改用不依赖公网 IP 的组网工具。
  • 保留一条备用通路:SSH 和屏幕共享至少一条不依赖第三方软件。

在三万主机租用的机器,SSH 和屏幕共享在交付时已经开好;如果改了网络或登录相关设置后连不上,可以在 09:00–22:00(温哥华时间)联系支持协助处理。

FAQ

常见问题

Mac mini 长期开机会不会伤机器?

Mac mini 的功耗和发热在空闲时都很低,长期开机本身不是问题。需要注意的是通风、供电稳定和定期安装系统更新。真正影响可用性的通常是休眠设置和重启后的登录状态,而不是硬件。

开了 FileVault,远程重启后还能 SSH 上去吗?

普通重启后,FileVault 会停在开机时输入 FileVault 密码的界面,需要有人输入密码,期间一般无法 SSH。计划内重启请用 sudo fdesetup authrestart,它会在下一次启动时自动完成一次 FileVault 认证。

LaunchAgent 和 LaunchDaemon 选哪个?

需要在没人登录时也运行的服务(Web 服务、数据库、CI Runner 的后台进程)用 LaunchDaemon,放在 /Library/LaunchDaemons;需要图形界面或依赖用户钥匙串的任务用 LaunchAgent,它只在该用户登录后运行。

微信
微信客服二维码扫码加微信客服手机上长按二维码识别
Telegram 客服