最可靠方式是用 launchd 搭配轻量检测脚本:原生、低开销、开机生效、自动拉起崩溃服务;crontab 因 catalina 后默认禁用、隐私权限限制、环境变量缺失及高频轮询负担重而不推荐。
macos 上让关键后台进程保持活跃,最可靠的方式不是靠 crontab 轮询杀启,而是用 launchd 搭配轻量检测脚本——它原生、低开销、开机即生效,还能自动拉起崩溃的服务。
为什么不用 crontab 做定时重启?
macOS 自 Catalina 起默认禁用 cron 守护进程;即使启用,它也受限于隐私权限(需手动授予“完全磁盘访问”),且环境变量缺失常导致脚本找不到命令或路径错误。高频轮询(如每分钟检查)还会增加系统负担,而 launchd 是 macOS 原生服务管理器,更精准、更省资源。
核心思路:检测 + 安全重启
不粗暴 kill -9,而是先判断进程是否真挂了,再决定是否重启。典型逻辑包括:
- 用 pgrep -x "进程名" 检查主进程是否存在(比 ps | grep 更干净,避免匹配到自身脚本)
- 若未运行,先校验配置(如 nginx -t)、再启动(如 nginx)
- 若进程存在但无响应,可加一层 curl 或 lsof 验证端口/HTTP 响应,再做优雅停止(nginx -s quit)后重拉
- 所有操作写入日志,便于排查(例如 >> /var/log/myapp-watch.log 2>&1)
用 launchd 实现每 30 秒自动检测
以守护 Nginx 为例:
- 把检测脚本存为 /usr/local/bin/nginx-watchdog.sh,赋予执行权限:
sudo chmod +x /usr/local/bin/nginx-watchdog.sh - 创建 plist 文件:
sudo nano /Library/LaunchDaemons/local.nginx.watchdog.plist - 内容中关键项包括:
– Label:唯一标识(如 local.nginx.watchdog)
– ProgramArguments:完整调用路径(/usr/local/bin/nginx-watchdog.sh)
– StartInterval:设为 30,表示每 30 秒执行一次
– RunAtLoad 和 KeepAlive 可选,用于开机加载和异常后自动重启脚本自身 - 加载并启用:
sudo launchctl load /Library/LaunchDaemons/local.nginx.watchdog.plist
sudo launchctl start local.nginx.watchdog
其他进程适配要点
不同进程需微调脚本逻辑:
- PyCharm / Resilio Sync 等 GUI 应用:不能用 system 级 LaunchDaemon(无图形会话),改用用户级 LaunchAgent(~/Library/LaunchAgents/),并确保 LaunchOnlyOnce 设为 false,配合 StartCalendarInterval 定时触发
- 自研后台服务:建议在脚本开头加 cd /path/to/app && ./start.sh,避免路径问题;启动命令优先用 nohup ./myserver > /dev/null 2>&1 & 后台运行
- 权限敏感服务(如监听 80 端口):plist 中需明确指定 UserName 和 GroupName,避免因权限不足启动失败











