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

Macos OSX上的“launchctl unload”是否将“ProgramArguments”传递给目标应用程序?,macos,launchd,Macos,Launchd,我正在尝试设置一个.plist文件,以便与OSX上的launchctl一起使用。当不使用launchctl从命令行运行时,我们的应用程序将按以下方式执行: /path/to/ourapp 。。。要终止我们的应用程序,请键入: /path/to/ourapp -k 。。。这会导致ourapp的新实例正确终止正在运行的前一个实例 现在,我设置了一个.plist文件,通过launchctl控制应用程序的执行,如下所示: // start.plist <dict> <key

我正在尝试设置一个.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时,应用程序的执行似乎与

/path/to/ourapp -k
有人能告诉我launchctl unload真正在做什么吗?即它是否使用给定的参数从命令行调用应用程序,以及在使用launchctl unload时,我可以做些什么来让stop.plist工作,无论它在做什么?

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

简短回答 我不确定您是否正在使用launchctl并按照设计的方式启动,但请尝试:

launchctl load /path/to/stop.plist
更长的答案 launchctl命令用于控制在任何给定时间运行哪些plists launchd。当您发出:

launchctl load /path/to/start.plist
plist被加载到launchd中,您的应用程序被触发。一个关键点是,除非我们的应用卸载start.plist,否则它仍将在launchd中运行。您可以通过查看以下位置的输出来检查这一点:

launchctl list
调用卸载stop.plist没有任何效果的原因是它从未加载到launchd中。要停止它,您必须首先从以下内容开始:

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

从您在这里描述的情况来看,launchd和launchctl可能不是最好的方法。如果你想坚持使用它,我认为你需要在你的应用程序中添加系统调用,这样当发出kill命令时,它也会卸载start和stop plist。或者,编写一个代理脚本,卸载plists,然后调用您的ourapp-k。这样,下次使用launchctl load/path/to/start.plist时,您就不会试图启动已经运行的程序

另一个注释。您可能只是将ourapp用作占位符,但值得指出的是,您可能希望使用唯一的标签名称。如果没有其他内容,它将帮助您使用launchctl列表跟踪它们。我不知道Launch本身是否会出现名称重复的问题,但避免这种可能性似乎是最安全的

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

简短回答 我不确定您是否正在使用launchctl并按照设计的方式启动,但请尝试:

launchctl load /path/to/stop.plist
更长的答案 launchctl命令用于控制在任何给定时间运行哪些plists launchd。当您发出:

launchctl load /path/to/start.plist
plist被加载到launchd中,您的应用程序被触发。一个关键点是,除非我们的应用卸载start.plist,否则它仍将在launchd中运行。您可以通过查看以下位置的输出来检查这一点:

launchctl list
调用卸载stop.plist没有任何效果的原因是它从未加载到launchd中。要停止它,您必须首先从以下内容开始:

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

从您在这里描述的情况来看,launchd和launchctl可能不是最好的方法。如果你想坚持使用它,我认为你需要在你的应用程序中添加系统调用,这样当发出kill命令时,它也会卸载start和stop plist。或者,编写一个代理脚本,卸载plists,然后调用您的ourapp-k。这样,下次使用launchctl load/path/to/start.plist时,您就不会试图启动已经运行的程序

另一个注释。您可能只是将ourapp用作占位符,但值得指出的是,您可能希望使用唯一的标签名称。如果没有其他内容,它将帮助您使用launchctl列表跟踪它们。我不知道Launch本身是否会出现名称重复的问题,但避免这种可能性似乎是最安全的