我正在尝试设置.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
时,给出了它正在做什么?
答案 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本身是否会出现重复名称的问题,但是避免这种可能性似乎是最安全的。