Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Macos Mac OSX LaunchDaemon在卸载时运行某些东西_Macos_Plist_Launchd - Fatal编程技术网

Macos Mac OSX LaunchDaemon在卸载时运行某些东西

Macos Mac OSX LaunchDaemon在卸载时运行某些东西,macos,plist,launchd,Macos,Plist,Launchd,我是MacOSX新手,我正在尝试开发一个守护进程(我熟悉windows服务,并尝试实现同样的目标) 到目前为止我所做的: 设法在启动守护进程中写入plist文件(我发现这些守护进程在系统帐户下运行,而不是在用户帐户下运行,就像具有本地系统权限的windows服务一样) 我设法让它在启动时运行,并运行我的简单hello world应用程序,它只需每隔10秒向文件写入一些内容 问题是,当我用launchd卸载守护进程时,它只会终止我的进程。 有没有办法让守护进程在卸载时运行其他程序,或者与我的进程通

我是MacOSX新手,我正在尝试开发一个守护进程(我熟悉windows服务,并尝试实现同样的目标)

到目前为止我所做的:

设法在启动守护进程中写入plist文件(我发现这些守护进程在系统帐户下运行,而不是在用户帐户下运行,就像具有本地系统权限的windows服务一样)

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

问题是,当我用launchd卸载守护进程时,它只会终止我的进程。 有没有办法让守护进程在卸载时运行其他程序,或者与我的进程通信它正在关闭,这样我就可以在代码中执行卸载操作


谢谢

守护程序的生命周期由苹果公司记录,他们描述了如何处理

如果您使用的是Objective-c或Swift,您应该能够实现委托方法

如果您不使用可可粉:

非Cocoa应用程序将收到一个“退出应用程序”苹果活动(kAEQuitApplication),作为一种礼貌,让它们有机会优雅地关闭

最后,由于您正在运行守护进程(后台进程)

对于后台进程,程序略有不同。loginwindow程序通过向进程发送退出应用程序Apple事件(kAEQuitApplication)来通知进程即将终止。然而,与前台进程不同,loginwindow不等待回复。它继续通过发送SIGKILL信号来终止任何开放后台进程,而不管返回的任何错误

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


有一个关于处理SIGTERM的讨论

这很有帮助,谢谢。我的应用程序是用.NETCore编写的,我将尝试在其中找到接收kAEQuitApplication事件的方法。然而,在我的plist文件中,我实际上以我的程序集作为参数运行“dotnet”,所以这可能有点棘手。如果我得到一些结果,我会告诉你。为.net core找到它。您只需附加到assemblyloadcontext的卸载事件:assemblyloadcontext.Default.Unload+=MethodInvokedOnSigTerm;