macOS:程序检查进程是否作为 launchDaemon 或 launchAgent 或从命令行运行

macOS : programmatic check if process runs as a launchDaemon or launchAgent or from command-line

我想了解我的流程 运行 来自的上下文。我想区分以下情况:

  1. 它作为持久性计划任务运行 (launchDaemon/launchAgent)
  2. 它是按需调用的,由 launchd 使用 open 命令行或双击创建。
  3. 直接从命令行终端调用(即 > /bin/myProg 从终端)

也许有任何关于使用 Objective-c/swift 框架或任何其他方式的进程上下文的指示?我希望避免在这里发明轮子:-)

谢谢

绝对没有简单的 public API 或框架可以做到这一点,而且很难做到。

此信息的 部分 部分 可能 可以通过您的进程本身与 一些 检索将在一些 系统版本上工作的侧向方式:

  • 有一个基于C的launchctl ,你可以尝试用它来枚举所有 启动 daemon/agent 任务并搜索您的应用程序 path/pid。你可以 执行此操作需要您的进程的根权限。

  • 使用open命令行有时会被环境追踪 它为您的流程设置的变量。

  • 运行 直接从命令行可以使 responsible_pid 正确填充(这是来自 libquarantine 的私有 API,除非您使用 Endpoint Security 开始观察它来自 11.smth 版本)

所有这些东西,除了 launchctl API,都不是 public,不可靠,Apple 随时可能损坏,可能无法满足您的需求。

但值得一试,因为没有比这更好的了:)

您可能会使用系统事件监控将您想要的所有情况与您控制的其他(root 允许的)进程区分开来,可能采用端点安全框架(需要 Apple 的授权,不能通过 AppStore 分发),调用了很多私有 APIs 和一堆逆向技巧。

我可以就此主题建议的开放资源是 here