在macOS Monterey12.4上用Rails的Searchkick执行Model.reindex时遇fork()错误
解决macOS Monterey下Searchkick执行
Model.reindex时的objc fork崩溃问题 问题场景
在macOS Monterey 12.4本地控制台中,使用Rails的Searchkick(基于ElasticSearch)执行Model.reindex操作时,触发以下错误:
ETHON: Libcurl initialized objc[36397]: +[NSNumber initialize] may have been in progress in another thread when fork() was called. objc[36397]: +[NSNumber initialize] may have been in progress in another thread when fork() was called. We cannot safely call it or ignore it in the fork() child process. Crashing instead. Set a breakpoint on objc_initializeAfterForkError to debug.
解决方案
临时终端修复
在启动Rails控制台前,先设置环境变量禁用objc的fork安全检查:
export OBJC_DISABLE_INITIALIZE_FORK_SAFETY=YES
之后再执行rails c进入控制台,执行Model.reindex即可正常运行。
永久配置生效
如果不想每次手动设置环境变量,可将配置添加到shell配置文件:
- 若使用Bash,编辑
~/.bash_profile或~/.bashrc,添加:export OBJC_DISABLE_INITIALIZE_FORK_SAFETY=YES - 若使用Zsh,编辑
~/.zshrc,添加上述内容后,执行source ~/.zshrc使配置立即生效。
项目内配置
也可以直接在Rails项目中配置该环境变量,在config/initializers/searchkick.rb中添加:
ENV['OBJC_DISABLE_INITIALIZE_FORK_SAFETY'] = 'YES'
原因说明
这个错误是macOS Monterey引入的Objective-C类初始化安全机制导致的:当进程执行fork()时,如果父进程中有线程正在执行类的initialize方法,子进程会触发崩溃。禁用该安全检查可绕过此问题,在开发环境中完全安全。
内容的提问来源于stack exchange,提问作者diasks2
相关产品推荐
相关产品推荐

