我是Mac OSX的新手,我正在尝试开发一个守护进程(我熟悉Windows服务,并尝试实现相同的功能)。
到目前为止我做了什么:
管理在LaunchDaemons中编写一个plist文件(我发现这些守护进程在系统帐户下运行,而不是用户,就像具有本地系统权限的Windows服务一样)。
我设法让它在启动时运行,然后运行我的简单hello world应用程序,它每隔10秒就会写一些文件。
问题是,当我用launchd卸载守护进程时,它只会杀死我的进程。 有没有办法让守护进程在卸载时运行其他东西,或者与我的进程通信它正在关闭,所以我可以在我的代码中执行卸载操作?
谢谢
答案 0 :(得分:2)
Apple记录了守护程序的生命周期,它们描述了如何处理Terminating Processes
如果您使用的是Objective-c或Swift,则应该能够实现applicationshouldterminate委托方法。
如果你没有使用Cocoa:
非Cocoa应用程序收到“退出应用程序”Apple事件(kAEQuitApplication),作为礼貌,让他们有机会优雅地关闭
最后,因为你正在运行一个守护进程(后台进程)
对于后台进程,该过程略有不同。 loginwindow程序通过向其发送退出应用程序Apple事件(kAEQuitApplication)来通知进程即将终止该进程。但是,与前台进程不同,loginwindow不会等待回复。它继续通过发送SIGKILL信号来终止任何打开的后台进程,无论是否有任何返回的错误。
如果系统正在关闭或重新启动,它会向所有后台程序发送SIGTERM信号,几秒钟之后会发出SIGKILL信号。
有关于处理SIGTERM here.
的讨论