OSX上的“launchctl unload”是否将“ProgramArguments”传递给目标应用程序?

时间:2011-07-28 06:33:55

标签: macos launchd

我正在尝试设置.plist文件,以便在OSX上与launchctl一起使用。从命令行运行(不使用launchctl)时,我们的应用程序执行如下:

/path/to/ourapp

...要终止我们的申请,我们输入:

/path/to/ourapp -k

...这会导致ourapp的新实例正确终止正在运行的上一个实例。

现在我设置一个.plist文件来控制通过launchctl执行应用程序,如下所示:

// start.plist
<dict>
    <key>Disabled</key>
        <false/>
    <key>Label</key>
        <string>ourapp</string>
    <key>ProgramArguments</key>
        <array>
            <string>/path/to/ourapp</string>
        </array>
    <key>OnDemand</key>
        <false/>
    <key>UserName</key>
        <string>daniel347x</string>
    <key>SHAuthorizationRight</key>
        <string>system.preferences</string>
</dict>

...我在命令行执行它,如下所示:

launchctl load /path/to/start.plist

这可以成功启动应用程序。

不幸的是,在创建stop.plist时,如下所示(唯一的区别是添加了-k参数):

// stop.plist
<dict>
    <key>Disabled</key>
        <false/>
    <key>Label</key>
        <string>ourapp</string>
    <key>ProgramArguments</key>
        <array>
            <string>/path/to/ourapp</string>
            <string>-k</string>  // <-- only difference is adding this argument
        </array>
    <key>OnDemand</key>
        <false/>
    <key>UserName</key>
        <string>daniel347x</string>
    <key>SHAuthorizationRight</key>
        <string>system.preferences</string>
</dict>

...并通过

执行
launchctl unload /path/to/stop.plist

...应用程序没有终止...因此,似乎在使用launchctl时,应用程序没有被等效地执行

/path/to/ourapp -k

有人可以告诉我launchctl unload到底在做什么 - 也就是说它是否使用给定的参数从命令行调用应用程序 - 以及我可以做些什么来让我的stop.plist工作在使用launchctl unload时,给出了它正在做什么?

1 个答案:

答案 0 :(得分:4)

高级

不,OSX上的“launchctl unload”不会将“ProgramArguments”传递给目标应用程序。它将plist从正在运行的plist中删除。

简短回答

我不确定您是否正在使用launchctl并以其设计方式启动,但请尝试:

launchctl load /path/to/stop.plist

更长的答案

launchctl命令用于控制在任何给定时间运行的plist。当你发出:

launchctl load /path/to/start.plist

将plist加载到launchd中并触发你的“ourapp”。关键的一点是,除非“ourapp”卸载start.plist,否则它仍将在launchd中运行。您可以通过查看以下输出来检查:

launchctl list

你调用卸载stop.plist没有任何影响的原因是它从未加载到launchd开始。为了能够阻止它,你必须首先启动它:

launchctl load /path/to/stop.plist

这样做的好处是,一旦你这样做,你的start.plist和stop.plist都将运行。显然,我还没有测试你的应用程序/设置,但这可能会导致奇怪的行为。另外,我不确定start.plist上再次运行“load”会发生什么,因为它已经在运行了。

形成您在此处描述的内容,看起来像launchd和launchctl可能不是最好的方法。如果你想坚持下去,我认为你需要将系统调用添加到你的“ourapp”中,这样​​当它发出kill命令时它还会卸载start和stop plist。或者,编写一个卸载plist的代理脚本,然后调用“ourapp -k”。这样,下次使用“launchctl load /path/to/start.plist”时,您将不会尝试启动已经运行的东西。


另一个注意事项。您可能刚刚使用“ourapp”作为占位符,但值得指出您可能想要使用唯一的Label名称。如果没有别的,它会帮助你用“launchctl list”跟踪它们。我不知道launchd本身是否会出现重复名称的问题,但是避免这种可能性似乎是最安全的。

相关问题