2017-09-25 98 views
0

我是Mac OSX新手,我正在尝试开发一个守护进程(我熟悉windows服务,并试图实现相同的目标)。Mac OSX LaunchDaemon在卸载时运行一些东西

我做了什么至今:

托管写在LaunchDaemons plist文件中(我发现,这些守护进程在系统帐户,而不是用户的身份运行,就像使用本地系统权限的Windows服务)。

我设法让它在启动时运行,并运行我的简单的hello world应用程序,该应用程序每10秒将一些内容写入文件。

问题是,当我用launchd卸载守护进程时,它只是杀死了我的进程。 有没有办法让守护进程在卸载时运行其他的东西,或者向我的进程传达它正在关闭,所以我可以在我的代码中执行卸载操作?

谢谢

回答

1

守护程序的生命周期是由苹果记录,他们描述了如何如果您使用的Objective-C或斯威夫特处理Terminating Processes

,你应该能够实现applicationshouldterminate委托方法。

如果你不使用可可:

非可可应用程序收到“退出应用程序”苹果事件(kAEQuitApplication),出于礼貌,让他们有机会正常关闭

最后,因为你正在运行一个守护进程(后台进程)

后台进程,过程略有不同。 loginwindow程序通过发送一个Quit Application Apple事件(kAEQuitApplication)来通知进程它将要被终止。但是,与前台进程不同,loginwindow不会等待回复。无论返回的错误是什么,它都会通过发送一个SIGKILL信号来终止任何开放的后台进程。

如果系统正在关闭或重新启动,它会向所有守护程序发送一个SIGTERM信号,几秒钟之后会发出SIGKILL信号。

有关于处理SIGTERM here.

+0

这是非常有用的讨论,谢谢。我的应用程序是用.Net Core编写的,我会尝试找到一种方法来在那里接收kAEQuitApplication事件。然而,在我的plist文件中,我实际上运行“dotnet”作为参数,所以它可能有点棘手。如果我得到一些结果,我会告诉你。 –