【问题标题】:Mac OSX LaunchDaemon run something on unloadMacos Launch Daemon 在卸载时运行某些东西
【发布时间】:2017-09-25 10:12:20
【问题描述】:

我是 Mac OSX 的新手,我正在尝试开发一个守护进程(我熟悉 Windows 服务,并试图实现相同的目标)。

到目前为止我做了什么:

设法在 LaunchDaemons 中编写了一个 plist 文件(我发现这些守护程序在系统帐户下运行,而不是用户,就像具有本地系统权限的 Windows 服务一样)。

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

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

谢谢

【问题讨论】:

    标签: macos plist launchd


    【解决方案1】:

    Apple 记录了守护程序的生命周期,并描述了如何处理 Terminating Processes

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

    如果您不使用 Cocoa:

    出于礼貌,非 Cocoa 应用程序会收到一个“退出应用程序”Apple 事件 (kAEQuitApplication),让它们有机会正常关闭

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

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

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

    关于处理SIGTERM的讨论here.

    【讨论】:

    • 这很有帮助,谢谢。我的应用程序是用 .Net Core 编写的,我会尝试找到一种方法来在那里接收 kAEQuitApplication 事件。但是,在我的 plist 文件中,我实际上以我的程序集作为参数运行“dotnet”,所以它可能有点棘手。如果我得到一些结果,我会告诉你的。
    • 为 .net core 找到了它。您需要做的就是附加到 AssemblyLoadContext 的 Unloading 事件:AssemblyLoadContext.Default.Unloading += MethodInvokedOnSigTerm;
    猜你喜欢
    • 1970-01-01
    • 2019-04-06
    • 1970-01-01
    • 2019-04-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-25
    • 1970-01-01
    相关资源
    最近更新 更多