我有通过授权服务‘AuthorizationExecuteWithPrivileges’呼叫根/管理员priveleges正在执行壳命令的数量庞大。的问题是,一段时间(10-15秒,也许100外壳命令)程序停止与在调试这个错误响应后:

不能叉:错误号35

和然后当应用程序正在运行,我不能启动任何更多的应用。我研究这个问题,显然就意味着没有可用的多个线程系统使用。然而,我检查使用活动监视器和我的应用程序仅使用4-5线程。

要解决这个问题,我想我需要做的是独立的shell命令到一个单独的线程(远离主线程)。我从来没有使用线程之前,我不能确定从哪里开始(没有全面的例子我能找到)

由于

有帮助吗?

解决方案

路易Gerbarg已经指出的那样,你的问题无关使用线程。我因此编辑您的标题和标签。

  

我外壳命令的数量庞大而与根/管理员priveleges通过授权服务‘AuthorizationExecuteWithPrivileges’呼叫执行。

不要那样做。该功能只存在这样你就可以恢复根:要以root身份运行管理所有权和setuid的模式位工具

的想法是,你应该分解出应作为根碰上从零件一个完全独立的程序,并不需要作为根运行代码,以使得需要根的部分可以有它(通过setuid位)并且不需要根可以去没有它(通过不具有的setuid的部分)。

一个代码的例子是在授权服务编程指南

  

在的问题是,一段时间(10-15秒,也许100外壳命令)程序停止与在调试这个错误响应后:

couldn't fork: errno 35

呀。您只能同时运行几百过程。这是一个OS强制限制。

这是一个软限制,这意味着你可以提出来,但最多只能硬限制,你不能提高。见limitlimit -h的输出(在zsh中;我不知道其他弹)。

您需要等待进程运行的进程之前完成。

  

和然后当应用程序正在运行,我不能启动任何更多的应用。

由于你,你自己也可以表示已运行尽可能多的进程。是x一百进程限制是每个用户,而不是每个进程。

  

我研究这个问题,显然就意味着没有可用的多个线程系统使用。

没有,它不会。

在errno错误码被用于许多事情。 EAGAIN(35,“资源暂时不可用”)可以指没有更多的线程由启动一个线程系统调用时设置,但它并不意味着由另一个系统调用或功能设置时。

您明确地引述该错误消息说,它是由fork设置,这是系统调用来开始新的处理的,而不是一个新的线程的。在这种情况下,EAGAIN意思是“您已经运行尽可能多的进程,你可以”。请参阅叉手册页

  

然而,我检查使用活动监视器和我的应用程序仅使用4-5线程。

请参阅?

  

要解决这个问题,我想我需要做的是单独的外壳命令到一个单独的线程(远离主线程)。

每个线程启动一个过程只会帮助您运行的进程要快得多。

  

我从来没有使用线程前...

这听起来像你还没有,因为你指的是功能启动一个进程,而不是一个线程。

其他提示

这不是关于线程(在应用程序中至少不线程)。这是关于系统资源。每个那些叉形进程正在消耗至少1内核线程(也许更多),一些的vnode,以及一些其他的事情。最终,系统将不允许你产卵多个进程。

你打的第一个限制是管理限量值。该系统可以支持更多,但它可能会导致性能下降等问题。通常,您可以通过各种mecahanisms提出这些,喜欢的sysctl。一般来说这样做是一个坏主意,除非你有一个特定的(特殊)的工作,你知道会从特定的调整中受益的负载。

机会是提高这些限制不会解决你的问题。虽然调整这些限制可能会让你运行的时间更长一点,实际上为了解决这个问题,你需要弄清楚为什么资源没有被返回到系统。根据你所描述的上述我猜想,你的派生的进程永远不会退出。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top