OS X应用程序可以检查调用它的launchd plist吗?

时间:2013-12-02 21:51:13

标签: macos cocoa plist launchd

我正在编写一个可能被多个launchd作业调用的应用程序 - 也就是说,可能有两个不同的LaunchAgent .plist文件,这些文件使用不同的程序参数调用应用程序,或者不同的条件。我希望应用程序能够检查作业或作业的.plist,以便它可以根据它在那里找到的内容调整其行为。

特别是,假设某个程序foo可以从A.plistB.plist启动,我希望程序能够根据哪个作业保留不同的状态/ plist调用它。如果我能做的就是检测工作的(推测的不同)Label,那就足够了(虽然会更好)。

显而易见的方法是在作业中的ProgramArguments数组中使用不同的标志,或者在EnvironmentVariables中设置不同的值,但这两个都感觉很脆弱,都意味着重复配置,都需要额外的文档(“将Label的值复制到EnvironmentVariables字段FOO ...;不要问为什么”。

我可以看到函数SMJobCopyDictionary。有了这个,似乎我可以访问作业的字典 - 也就是说,这个信息原则上是 - 但我需要先了解作业的标签。函数SMCopyAllJobDictionaries允许我遍历所有作业,但是我找不到调用应用程序的特定实例的作用并不明显。

谷歌搜索launchd read job labellaunchd self dict(或类似的)没有提供任何有用的信息。

3 个答案:

答案 0 :(得分:1)

事实上,使用ProgramArguments可能是处理此问题的最佳方法。它将使您的代码更具可移植性(例如,可以在Linux中启动,例如,或在不同的启动守护程序下启动),以使用配置行为的程序参数,而不是依赖于程序调用链。

但是,关于程序参数,我建议不要复制标签,而是使用作业之间不同的特定标志。例如,您可以将A.plist和B.plist中的--checkpoint-file和--log-file设置为恰好在其名称中包含“A”或“B”的文件。这样做会使依赖于--checkpoint-file和--log-file的应用程序代码比基于某些标签做出任意选择更加清晰,并且还允许您直接从命令行,尽管没有调用PLIST文件,它仍然可以工作。

答案 1 :(得分:1)

查看Apple网站上的SampleD code。此代码显示了守护程序如何访问调用的启动信息。

查看launch.h标题,我怀疑LAUNCH_JOBKEY_LABEL就是你所追求的。

答案 2 :(得分:1)

摘要:我认为这里的答案是合格的号码。

格雷厄姆·米尔恩的答案(我已经接受了)表明事实上这是可能的, 但他提到的界面显然没有在其他地方记录 此示例代码,也可能在 Mac OS X Internals:A中 系统方法(Amit Singh,http://osxbook.com,感谢Mitchell J. Laurren-Ring指出这一点。)

我也在launchd-dev list上询问过这个问题(参见开头的主题 my question), 而Damien Sorresso则认为这个界面“真的只是为了那份工作 可以使用launchd检入以获取侦听套接字。他们太笼统了 一开始。“

放在一起,我留下的感觉是,虽然我的行为 希望似乎有可能,虽然我认为在这种情况下它比整个更简洁 在环境变量中传递更多状态,API支持这样的 行为是,如果不是弃用,至少有点气馁, 无论如何不是惯用的。