我正在尝试使用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上创建并执行进程就好了。
答案 0 :(得分:2)
我认为这是一个背景问题。 OsX不是linux,它基于BSD,但它不仅仅是一个克隆/ 发行版。在它的核心,有这个 Mach 内核,它给你DOS(在拒绝服务中)处理。我从这一行得到了这个:
Switching sessions is not allowed in the system Mach bootstrap
我认为问题在于Mach处理引导上下文的方式。 nohup
表示执行的命令可以/可能在您的情况下退出注销。使用wget
时,这不会计算:
在Mach中,引导任务被分配负责查找Mach端口的请求。作为这项工作的一部分,每个Mach任务都在两个组中的一个中注册 - 在启动上下文或用户的登录上下文中
你在登录上下文中使用nohup
分配一个孩子,这是我上次检查后,在注销后清理(自动释放池式)。这不是真的有效吗,是吗?
更重要的是:您正在处理响应请求的PHP,但同时,分叉子进程可能比管理这些请求的上下文更长。因此,这会影响nohup
:
对于使用nohup运行后台作业的用户或使用屏幕分离终端会话的用户,上下文也会造成问题。有时候程序在注销后仍然存在是完全合理的,但默认情况下,这不会发生。
基本上,因为您正在从登录上下文运行进程,所以任何子进程都会自动在相同(登录)上下文中运行。在您的情况下,您对子流程负责,但nohup
意味着它可能比您的上下文更长,没有人对此流程负责,这可能是有害的。它需要上下文启动。这有点危险。我没有找到明确的方法,su[do]
没有帮助,因为这对上下文没有影响。
我能想到的唯一方法是编写一个在启动上下文中运行的脚本/守护进程,并等待你将命令传递给它,因为在启动上下文中运行的任何守护进程都会在其中运行子进程自己的(启动)上下文。无论如何,我收集了httpd
的工作方式
或者,或者创建第三个上下文,但我不能告诉你如何安全地做到这一点......