0

我正在尝试使用 nohup 在 mac 上创建进程。进程已创建,但在创建后立即终止。该进程具有命令 /usr/bin/wget http://local.domain/some.php。这是来自 /var/log/system.log 的错误

(0x7fed9c80a940.anonymous.nohup[23454]): Bug: 12E55: launchd + 67394 [7DCC9489-2DF5-3807-83FA-EF5666EE8078]: 0x0
(0x7fed9c80a940.anonymous.nohup[23454]): Switching sessions is not allowed in the system Mach bootstrap.
(0x7fed9c80a940.anonymous.nohup[23454]): _vprocmgr_switch_to_session(): kr = 0x44c

我现在被这个问题困扰了几天。

进程在linux上创建和执行就好了。

4

1 回答 1

2

我认为这是语境问题。OsX 不是 linux,它基于 BSD,但它不仅仅是一个克隆/发行版。在它的核心中,有这个Mach内核,它为您提供 DOS(如拒绝服务)处理。我从这一行得到这个:

Switching sessions is not allowed in the system Mach bootstrap

我认为,问题在于 Mach 处理引导上下文的方式。nohup意味着在您的情况下,执行的命令可以/可能在注销后仍然存在。使用 时wget,这不会计算:

在 Mach 中,引导任务被分配负责查找对 Mach 端口的请求。作为这项工作的一部分,每个 Mach 任务都注册在两个组之一中——在启动上下文中或用户的登录上下文中

nohup在登录上下文中使用了一个孩子,这是我上次检查时在注销后清理的(某种 autoreleasepool 样式)。这真的行不通,不是吗?
更重要的是:您正在处理响应请求的 PHP,但同时,分叉的子进程可能比管理这些请求的上下文寿命更长。因此,这会影响使用nohup

对于使用 nohup 运行后台作业的用户或使用屏幕分离终端会话的用户,上下文也会带来问题。有时程序在注销后仍然存在是完全合理的,但默认情况下不会发生这种情况。

基本上,因为您正在从登录上下文运行进程,所以任何子进程都会自动在相同的(登录)上下文中运行。在您的情况下,您对子进程负责,但nohup暗示它可能会超过您的上下文,没有人对进程负责,这可能是有害的。它需要启动上下文。这有点冒险。我还没有找到一个明确的解决方法,su[do]没有帮助,因为这对上下文没有影响。
我能想到的唯一方法是让您编写一个在启动上下文中运行的脚本/守护进程,并且空闲的,等待您将命令传递给它,因为在启动上下文中运行的任何守护进程都会在其中派生子进程自己的(启动)上下文。httpd无论如何,我认为这就是工作方式

要么,要么创建第三个上下文,但我无法告诉你如何安全地做到这一点......

来源:OSX 内核编程指南

于 2013-08-14T12:02:41.973 回答