3

我正在尝试用我们的 OS X 应用程序解决这个奇怪的问题。

作为正常操作的一部分,它会启动一个长时间运行的后台进程——特别是一个用 node.js 编写的 Web 服务器。

运行一段时间后,后台进程在活动监视器中显示为“无响应”。

但它仍然正常运行,响应来自 Web 浏览器的请求,并且没有占用高比例的 CPU 或任何东西。

我想了解究竟是什么可能导致显示此状态,因为它甚至不是一个 GUI 应用程序。如果没有 Cocoa 事件循环,OS X 究竟使用什么来确定命令行应用程序是否没有响应?

是否可以以某种方式将其标记为后台进程,以便系统不会查询它以获取响应?

提前致谢。

更新:刚刚检查过,从命令行启动任务时似乎也会发生同样的情况。是什么让活动监视器上的后台应用程序“无响应”?

4

2 回答 2

4

好的,正如sergio在他的评论中指出的那样,这确实是 Node.JS 特有的东西。

负责我们应用程序的 Node.JS 部分的开发人员能够将问题的根源追溯到process.titleNode.JS 中属性的使用。

看起来libuv中的实现process.title 做了很多 Core Foundation 技巧来设置进程标题,所以这些可能是通过 Activity Monitor 用来区分 Cocoa 应用程序和 CLI 应用程序的任何启发式方法将进程标记为 GUI 应用程序。

我们已经在 libuv 上提交了一个关于此问题的错误报告,但现在我们跳过process.title它,因为简单地设置它会导致服务器在几分钟后在活动监视器上显示为“无响应”。

更新:截至本次提交,这已在 libuv 中修复。它还没有传播到节点版本。

于 2013-10-23T19:22:31.427 回答
1

根据Apple 的 Process Manager ReferenceGetCurrentProcess, GetFrontProcess(et al.) 在 OS X 10.9 中已弃用,并导致 Activity Monitor 中出现“无响应”问题(我的观察)。

于 2013-10-29T14:47:00.433 回答