首页 > 解决方案 > 如果使用“rails server”,Mac OS Catalina 无法正确关闭

问题描述

我一直rails server在 Mac OS Catalina 上使用 Rails 6.0.1。我注意到,如果启动服务器(无论是使用 Puma 还是 unicorn),然后将其关闭,然后尝试关闭计算机,它就会挂起,直到 Apple 的看门狗强制关闭系统。在下一次启动时,我总是得到相同的崩溃报告。

panic(cpu 2 caller 0xffffff7f8ef9daae): watchdog timeout: no checkins from watchdogd in 187 seconds (21 totalcheckins since monitoring last enabled), shutdown in progress
Backtrace (CPU 2), Frame : Return Address
0xffffff83b7473c40 : 0xffffff800e539a3b
0xffffff83b7473c90 : 0xffffff800e670fe5
0xffffff83b7473cd0 : 0xffffff800e662a5e
0xffffff83b7473d20 : 0xffffff800e4e0a40
0xffffff83b7473d40 : 0xffffff800e539127
0xffffff83b7473e40 : 0xffffff800e53950b
0xffffff83b7473e90 : 0xffffff800ecd1875
0xffffff83b7473f00 : 0xffffff7f8ef9daae
0xffffff83b7473f10 : 0xffffff7f8ef9d472
0xffffff83b7473f50 : 0xffffff7f8efb2e76
0xffffff83b7473fa0 : 0xffffff800e4e013e
      Kernel Extensions in backtrace:
         com.apple.driver.watchdog(1.0)[AA44EEB8-57FA-3CAC-9105-C7AB21900B9A]@0xffffff7f8ef9c000->0xffffff7f8efa4fff
         com.apple.driver.AppleSMC(3.1.9)[6DA4BDC6-9C64-34B3-A60E-D345D2DC2D5F]@0xffffff7f8efa5000->0xffffff7f8efc3fff
            dependency: com.apple.driver.watchdog(1)[AA44EEB8-57FA-3CAC-9105-C7AB21900B9A]@0xffffff7f8ef9c000
            dependency: com.apple.iokit.IOACPIFamily(1.4)[4A40B298-87E0-373E-84A9-9A2227924F8F]@0xffffff7f8ef07000
            dependency: com.apple.iokit.IOPCIFamily(2.9)[AA7C7A4F-9F5D-3533-9E78-177C3B6A72BF]@0xffffff7f8ef10000

BSD process name corresponding to current thread: kernel_task
Boot args: chunklist-security-epoch=0 -chunklist-no-rev2-dev

Mac OS version:
19B88

Kernel version:
Darwin Kernel Version 19.0.0: Thu Oct 17 16:17:15 PDT 2019; root:xnu-6153.41.3~29/RELEASE_X86_64

有没有其他人看到这个问题,你是如何解决它的?我的猜测是rails server某些进程即使在通过 Ctrl-C 关闭后仍在运行,这会阻止操作系统正确关闭。

标签: ruby-on-railsmacosmacos-catalinaruby-on-rails-6

解决方案


不是很专业的方法,但是...

  • 打开一个终端(如果可能的话,有特权)
  • 使用正在运行的进程的“ps”(我似乎记得“ps awxu”)拍摄快照
  • 启动 Rails 服务器
  • 修补一下
  • 现在停止服务器
  • 拍摄另一个快照

我完全希望一些低级后台进程一直在运行并且不听关闭信号。MacOS 的关机过程可能出于自身的利益而过于乖巧和礼貌。

如果是这种情况,请获取进程的 PID 或名称并尝试使用 HUP、TERM 和最后的 KILL 信号将其杀死。您可以通过检查它们的图像路径来很好地了解这些进程的开始位置(注意不要杀死无辜的进程)。

等待一段时间以确保 pkilling 进程不会使系统处于不稳定状态,然后尝试关闭机器并查看情况如何。


推荐阅读