获取的情况下,过程中的“真正的”父进程产生的间接使用的launchd
我维持OSX的工具,揭示了从直接父选定过程的父母树的鼻祖(通常的launchd)。获取的情况下,过程中的“真正的”父进程产生的间接使用的launchd
但是,如果已检查的进程间接通过使用事件(例如双击捆绑软件图标)或使用命令open
从bash运行进程从launchd间接产生,则此进程链可能会中断。在这些情况下,我希望相应地看到bash
或finder
。
也许XPC消息层是答案,因为我认为这些事件是通过这一机制的launchd。但是,其他可用的OSX框架总是受欢迎的。
编辑:
我明白,如果一个进程分离本身运行时,我不能恢复它的PPID,但我的目标是要追踪的是启动进程创建调用者。
谢谢
你看到的是正确的行为。
当用户从Finder中打开应用程序包,或者通过在终端中使用open
命令时,Launch Services负责执行应用程序。
将应用程序引入到OS X/macOS时,根据捆绑软件标识符在捆绑软件的Info.plist
文件中声明,它将在启动服务中注册。
当用户双击或在该终端使用open
,发射服务接收该包标识符,并启动先前已注册的应用程序。
应该注意的是,如果应用程序包的标识符不是唯一的,则会发生问题。通过两个具有相同版本和应用程序标识符的应用程序包,启动服务将执行它注册的第一个应用程序,但它可能不是用户认为它们正在运行的那个应用程序!
相反,如果您使用终端在应用程序包中直接执行二进制文件,而不使用open
,则其父文件将是终端使用的shell应用程序。例如: -
/Applications/Calculator.app/Contents/MacOS/Calculator
嗨,谢谢你回答我的问题。我知道这是正确的行为,但我不知道是否有任何方式能够追踪启动流程创建的实体,无论是“查找”双击事件还是“打开”命令。 – Zohar81
在用户模式下,没有。如果你真的确定了,我希望你可以用内核扩展来做到这一点,但这远远超出了SO问题的答案。 – TheDarkKnight
如果有必要,我愿意写一个kext,但我认为消息发送并不会通过内核,除非xpc正在通过mach消息。也许你可以给我一些从哪里开始的一般准则?非常感谢 – Zohar81
不能完全确定你在寻找什么,但如果一个进程分离本身,它以PID 1(INIT)作为其直接父.... –
我明白,我不能当一个过程在生命中脱离时,不会发生。但也许有一种方法来追踪进程调用者,而它只是从双击事件中产生,通过追踪查找器和启动之间的通信 – Zohar81