Cocoa 调用系统(“open<;app name.app>;”有时会导致以root用户身份启动app

Cocoa 调用系统(“open<;app name.app>;”有时会导致以root用户身份启动app,cocoa,launchd,Cocoa,Launchd,我有一个应用程序(确切地说是/Library/StartupItems中的守护进程)以root用户身份运行,它偶尔会使用system(“open/Applications/MyAppName.app”)启动另一个进程。这很好,只是在某些计算机上,MyAppName以root用户身份启动,而不是以当前用户的身份启动 我试图弄清楚为什么会这样,以及如何让应用程序始终以当前用户的身份启动 这个问题似乎发生在运行某种Open/Active directory组合的企业站点上。我对这些机器的访问有点有限,

我有一个应用程序(确切地说是/Library/StartupItems中的守护进程)以root用户身份运行,它偶尔会使用
system(“open/Applications/MyAppName.app”)
启动另一个进程。这很好,只是在某些计算机上,MyAppName以root用户身份启动,而不是以当前用户的身份启动

我试图弄清楚为什么会这样,以及如何让应用程序始终以当前用户的身份启动

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

我得到的另一个线索是,在至少一台这样的计算机上,如果打开活动监视器并检查“查找器”进程,“用户:”部分显示用户名,但没有用户id(“UID”部分完全丢失)

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

除了明显的安全问题外,我还需要应用程序不要以root用户身份运行,这样它就可以支持诸如对两个同时登录的用户开放/可见之类的功能


有没有人知道是什么原因导致了这一问题,或者我如何着手解决这一问题?

我有几点意见:

  • 您应该使您的守护程序成为一个正确的launchd守护程序,即在/Library/LaunchDaemons中粘贴一个plist<代码>/Library/StartupItems已过时。看

  • 您可能不应该直接从守护进程启动第二个守护进程。您可能应该让它成为另一个守护进程

  • 确保您熟悉此技术。注意:。这是必要的阅读,应该解释为什么有不止一个启动过程,并且应该给你关于你的案例中哪里出了问题的合理线索

  • 另一方面,
    open
    只是启动服务的包装,您可以直接访问这些服务,而不是调用
    system
    。但是,正如我所说,您不应该使用
    open
    或启动服务启动第二个守护进程


  • 如果你能发布更多关于你的守护进程到底做什么的详细信息,我们可能会给你关于最好的方法的建议。例如,最好按需启动启动启动守护程序,而不是让它们连续运行。

    我有几点意见:

  • 您应该使您的守护程序成为一个正确的launchd守护程序,即在/Library/LaunchDaemons中粘贴一个plist<代码>/Library/StartupItems已过时。看

  • 您可能不应该直接从守护进程启动第二个守护进程。您可能应该让它成为另一个守护进程

  • 确保您熟悉此技术。注意:。这是必要的阅读,应该解释为什么有不止一个启动过程,并且应该给你关于你的案例中哪里出了问题的合理线索

  • 另一方面,
    open
    只是启动服务的包装,您可以直接访问这些服务,而不是调用
    system
    。但是,正如我所说,您不应该使用
    open
    或启动服务启动第二个守护进程


  • 如果你能发布更多关于你的守护进程到底做什么的详细信息,我们可能会给你关于最好的方法的建议。例如,通常最好按需启动启动启动守护程序,而不是让它们连续运行。

    谢谢,这是一个很大的帮助。我的第二个应用程序确实改用了用户代理守护程序。谢谢,这帮了我不少忙。我确实已经切换到为我的第二个应用程序使用用户代理守护程序。