调用系统(“open <app name.app =”“>”)有时会导致应用程序以root身份启动</app>

时间:2009-07-06 22:57:00

标签: cocoa launchd

我有一个以root身份运行的应用程序(一个守护进程/ Library / StartupItems),它偶尔会使用system("open /Applications/MyAppName.app")启动另一个进程。这种方法很好,除了在某些计算机上启动MyAppName以root身份运行,而不是在当前用户下运行。

我正在试图找出原因,以及如何让应用程序始终以当前用户身份启动。

问题似乎发生在运行某些Open / Active目录组合的企业站点上。我对这些机器的访问有限,所以在我请求更多时间之前,我至少要形成一些假设。

我得到的另一条线索是,如果您打开活动监视器并检查“Finder”进程,至少有一台计算机上的“用户:”部分显示用户名但没有用户ID(“(UID) )“部分完全缺失。”

此外,与大多数标准应用程序一样,父进程显示为“launchd (1)”而不是“launchd (95)”。我认为这个launchd实例是在计算机启动并以root身份运行时首次启动的运行,与以登录用户身份运行的另一个launchd实例相比。

除了明显的安全问题之外,我还要求应用程序不以root用户身份运行,这样它就可以支持两个同时登录的用户打开/可见的内容。

是否有人对可能造成这种情况的原因或我如何解决这个问题有任何想法?

1 个答案:

答案 0 :(得分:5)

我收到了一些评论:

  1. 你应该让你的守护进程成为一个合适的launchd守护进程,即将一个plist粘贴在/ Library / LaunchDaemons中。 /Library/StartupItems已过时。请参阅http://developer.apple.com/documentation/MacOSX/Conceptual/BPSystemStartup/BPSystemStartup.html

  2. 您可能不应该直接从守护程序启动第二个守护程序。你应该把它变成另一个守护进程。

  3. 确保您熟悉此技术。注意:http://developer.apple.com/technotes/tn2005/tn2083.html。这是必不可少的阅读,并且应该解释为什么不止一个启动过程,并且应该为你提供关于你的案件出了什么问题的正确线索。

  4. 除此之外,open只是启动服务的包装器,您可以直接访问它,而不是调用system。但是,正如我所说,您不应该使用open或启动服务启动第二个守护程序。

  5. 如果您可以发布有关您的守护进程确切内容的更多详细信息,我们可能会就最佳方式向您提供建议。例如,通常最好按需启动启动守护程序,而不是让它们连续运行。