把 Mac mini 当成
7×24 小时服务器
Mac mini 默认按桌面电脑的习惯工作:会休眠、断电后不自动开机、重启后停在登录界面。当它在远处当服务器用时,这些默认值都要改。本文按顺序处理防休眠、断电自启、FileVault 与自动登录、launchd 守护进程,以及远程重启后如何确保能连回来。
防止休眠
图形界面:「系统设置 → 能耗」,打开「显示器关闭时防止自动进入睡眠」,并打开「通过网络访问唤醒」。命令行(需要管理员权限):
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 某个命令,命令结束后恢复默认。
断电后自动开机
停电恢复后让机器自动开机,以及系统卡死时自动重启:
sudo pmset -a autorestart 1
pmset -g | grep autorestart # 确认为 1
sudo systemsetup -setrestartfreeze on图形界面里对应「系统设置 → 能耗 → 断电后自动启动」。如果放在自己家里,建议配一个小型 UPS,减少短暂断电造成的重启次数。
自动登录与 FileVault 的冲突
有些任务必须在用户登录后才能运行,例如依赖图形界面的程序、iOS 模拟器、使用登录钥匙串的签名任务。这时会想打开自动登录(「系统设置 → 用户与群组 → 自动以此身份登录」)。但只要 FileVault 是开着的,macOS 就不允许自动登录,这个选项会是灰的。
- 保留 FileVault(更安全):服务尽量写成 LaunchDaemon,不依赖用户登录;计划内重启用
fdesetup authrestart。 - 关闭 FileVault 换取自动登录:磁盘不再加密,适合不存敏感数据的构建机,需要你自己评估。
fdesetup status # 查看 FileVault 状态
sudo fdesetup authrestart # 重启,下次开机自动完成一次 FileVault 认证用 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 不会读取新配置。
远程重启后的连接恢复
远程重启前先确认三件事:「系统设置 → 通用 → 共享」里「远程登录」(SSH)已打开;需要的服务都已经是 LaunchDaemon 或会自动启动;FileVault 状态你心里有数。
- SSH 在登录界面阶段就可用,不需要有人登录图形界面。
- Tailscale、内网穿透等工具如果只装了需要用户登录才启动的版本,重启后会连不上,应换成能以系统服务运行的方式,参见 用 Tailscale 接入远程 Mac。
- 住宅宽带的公网 IP 可能变化,靠 IP 直连时要配 DDNS,或者改用不依赖公网 IP 的组网工具。
- 保留一条备用通路:SSH 和屏幕共享至少一条不依赖第三方软件。
在三万主机租用的机器,SSH 和屏幕共享在交付时已经开好;如果改了网络或登录相关设置后连不上,可以在 09:00–22:00(温哥华时间)联系支持协助处理。
常见问题
Mac mini 长期开机会不会伤机器?
Mac mini 的功耗和发热在空闲时都很低,长期开机本身不是问题。需要注意的是通风、供电稳定和定期安装系统更新。真正影响可用性的通常是休眠设置和重启后的登录状态,而不是硬件。
开了 FileVault,远程重启后还能 SSH 上去吗?
普通重启后,FileVault 会停在开机时输入 FileVault 密码的界面,需要有人输入密码,期间一般无法 SSH。计划内重启请用 sudo fdesetup authrestart,它会在下一次启动时自动完成一次 FileVault 认证。
LaunchAgent 和 LaunchDaemon 选哪个?
需要在没人登录时也运行的服务(Web 服务、数据库、CI Runner 的后台进程)用 LaunchDaemon,放在 /Library/LaunchDaemons;需要图形界面或依赖用户钥匙串的任务用 LaunchAgent,它只在该用户登录后运行。
扫码加微信客服手机上长按二维码识别