独角兽与Ruby 2.4.1引起奇怪的崩溃

我正在从Ruby 2.3.1升级到Ruby 2.4.1,因此Unicorn似乎与新版本不兼容。 我得到以下错误。 我正在使用Unicorn 5.1.0并尝试使用Unicorn 5.3.1无济于事。 我是否需要使用不同的lib而不是XCode Tools进行编译?

在使用foreman start和Procfile foreman start服务器时,我立即收到错误:

 webpack: bin/webpack-dev-server gulp: gulp redis: ./scripts/start_redis_server.sh sidekiq: bundle exec sidekiq -C config/sidekiq.yml annotations_server: ./scripts/start_annotation_server.sh rails: bundle exec unicorn_rails -p 3000 -c config/unicorn.rb 

如果我使用简单的bin/rails s似乎开始并运行良好,我为什么我认为它是特定于Unicorn。

 objc[40847]: +[__NSPlaceholderDictionary initialize] may have been in progress in another thread when fork() was called. objc[40846]: +[__NSPlaceholderDictionary initialize] may have been in progress in another thread when fork() was called. objc[40846]: +[__NSPlaceholderDictionary 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. objc[40847]: +[__NSPlaceholderDictionary 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. E, [2017-10-05T12:12:01.618013 #40833] ERROR -- : reaped # worker=1 E, [2017-10-05T12:12:01.618064 #40833] ERROR -- : reaped # worker=0 I, [2017-10-05T12:12:01.619387 #40850] INFO -- : Refreshing Gem list I, [2017-10-05T12:12:01.620867 #40851] INFO -- : Refreshing Gem list 

MacOS High Sierra 改变了fork系统调用的行为,以便在分叉进程中调用Objective-C API被视为错误。

在macOS High Sierra上使用Ruby时,这就是Ruby所使用的。 同样的问题也会影响使用多进程模型的Puma和其他服务器,因此不是严格意义上的Unicorn(或Puma)问题,而是Ruby之一。

在Unicorn邮件列表和Puma问题上讨论了这个问题 。

作为解决方法,直到在Ruby中修复(或在Unicorn / Puma中解决),您可以在启动Ruby进程之前添加以下环境变量:

 OBJC_DISABLE_INITIALIZE_FORK_SAFETY=YES