cocoa - 调用系统 ("open <app name.app>")有时会导致应用程序以 root 身份启动

标签 cocoa launchd

我有一个以 root 身份运行的应用程序(准确地说是/Library/StartupItems 内的守护进程),偶尔会使用 system("open/Applications/MyAppName.app") 启动另一个进程。这工作正常,除了在某些计算机上 MyAppName 以 root 身份启动运行,而不是在当前用户下运行。

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

此问题似乎发生在运行某种开放/事件目录组合的企业站点上。我对这些机器的访问权限有些有限,因此在请求更多时间使用它们之前,我至少尝试做出一些假设。

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

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

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

有人对可能导致此问题的原因或我如何解决它有任何想法吗?

最佳答案

我有一些评论:

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

  2. 您可能不应该直接从守护程序启动第二个守护程序。您或许应该将其设为另一个守护进程。

  3. 确保您熟悉这项技术。注:http://developer.apple.com/technotes/tn2005/tn2083.html 。这是一本重要的读物,应该解释为什么有多个启动的进程,并且应该为您提供有关您的案例中出现问题的线索。

  4. 顺便说一句,open 只是 Launch Services 的包装器,您可以直接访问它,而不是调用 system。但是,正如我所说,您不应该使用 open 或 Launch Services 启动第二个守护程序。

如果您可以发布有关您的守护进程具体执行的操作的更多详细信息,我们也许可以为您提供有关最佳方法的建议。例如,通常最好让您的启动守护程序按需启动,而不是让它们持续运行。

关于cocoa - 调用系统 ("open <app name.app>")有时会导致应用程序以 root 身份启动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1089584/

相关文章:

macos - 如何使用 LaunchDaemons (launchd) 启动 Program.app?

cocoa - NSTask 输出格式

objective-c - 获取 Cocoa 中 NSMenuItem 的默认字体名称?

cocoa - 从 subview 中删除 View 不会调用 willRemoveSubview

macos - NSDatePicker 操作方法未触发

macos - 在 launchd 中使用 startCalendarInterval 每 x 分钟运行一次作业(例如在 cron 中使用步长值 "*/x")?

objective-c - NSOpenPanel 的 setDirectoryURL 不起作用

macos - mac 安全命令在守护进程运行时需要写权限?

objective-c - 使用 NSTimer 安排多个日常事件?

python - 在 launchd 中使用 virtualenvs 运行 python 时查找模块