我有一个以 root 身份运行的应用程序(准确地说是/Library/StartupItems 内的守护进程),偶尔会使用 system("open/Applications/MyAppName.app")
启动另一个进程。这工作正常,除了在某些计算机上 MyAppName 以 root 身份启动运行,而不是在当前用户下运行。
我试图找出原因,以及如何让应用程序始终以当前用户身份启动。
此问题似乎发生在运行某种开放/事件目录组合的企业站点上。我对这些机器的访问权限有些有限,因此在请求更多时间使用它们之前,我至少尝试做出一些假设。
我得到的另一条线索是,在至少其中一台计算机上,如果您打开事件监视器并检查“Finder”进程,“用户:”部分会显示用户名,但没有用户 ID(“(UID )”部分完全丢失)。
此外,父进程显示为“launchd (1)
”,而不是像大多数标准应用程序那样显示为“launchd (95)
”。我相信这个 launchd 实例是每次计算机启动并以 root 身份运行时首先启动的运行,与以登录用户身份运行的 launchd 的其他实例相比。
除了明显的安全问题之外,我需要应用程序不以 root 身份运行,以便它支持诸如对两个同时登录的用户开放/可见之类的功能。
有人对可能导致此问题的原因或我如何解决它有任何想法吗?
最佳答案
我有一些评论:
您应该使您的守护进程成为适当的 launchd 守护进程,即在/Library/LaunchDaemons 中粘贴一个 plist。
/Library/StartupItems
已过时。请参阅http://developer.apple.com/documentation/MacOSX/Conceptual/BPSystemStartup/BPSystemStartup.html .您可能不应该直接从守护程序启动第二个守护程序。您或许应该将其设为另一个守护进程。
确保您熟悉这项技术。注:http://developer.apple.com/technotes/tn2005/tn2083.html 。这是一本重要的读物,应该解释为什么有多个启动的进程,并且应该为您提供有关您的案例中出现问题的线索。
顺便说一句,
open
只是 Launch Services 的包装器,您可以直接访问它,而不是调用system
。但是,正如我所说,您不应该使用open
或 Launch Services 启动第二个守护程序。
如果您可以发布有关您的守护进程具体执行的操作的更多详细信息,我们也许可以为您提供有关最佳方法的建议。例如,通常最好让您的启动守护程序按需启动,而不是让它们持续运行。
关于cocoa - 调用系统 ("open <app name.app>")有时会导致应用程序以 root 身份启动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1089584/