【问题标题】:LaunchDaemon handling system shutdown - no SIGTERM?LaunchDaemon 处理系统关闭 - 没有 SIGTERM?
【发布时间】:2011-11-23 20:52:45
【问题描述】:

我编写了一个小型 python 脚本,我将其作为 LaunchDaemon 运行,以记录远程数据库的启动/关闭时间。当脚本启动时,它会记录启动时间,然后暂停并等待捕获 SIGTERM 以记录关闭时间。几乎相同的工作流程被用作登录/注销时间的 LaunchAgent。

但是,Apple 的突然终止机制似乎正在给事情带来麻烦。看来,当机器关闭或重新启动时,launchd 只是向启动守护进程和启动代理发送SIGKILL 信号,这是无法处理的。我可能在技术上错了,但这基本上就是我所经历的......

使用 launchctl 手动加载/卸载守护程序会触发 SIGTERM 处理程序。但是,当真正的系统关闭发生时,不会触发相同的代码。

有人对如何防止SIGKILL 提出建议吗?

【问题讨论】:

    标签: python macos launchd


    【解决方案1】:

    如果我正在阅读this 正确,它不应该在守护进程上使用突然终止,除非你在launchd plist 中有<key>EnableTransactions</key><true/>。但是文档有点模糊,所以我也尝试将<key>EnableTransactions</key><false/> 添加到 plist,或者如果这不起作用,请从您的程序中调用 vproc_transaction_begin(我假设您可以从 python 调用它,但我不知道机制)。

    【讨论】:

    • 哇...添加<key>EnableTransactions</key><false/> 就成功了。我之前省略了它,假设 false 是默认值。该进程现在被发送一个信号 15 (SIGTERM) 而不是信号 9 (SIGKILL)。
    • 是的。我也考虑过这一点,但我在 10.6 和 10.7 的 launchd.plist 手册页中发现与 EnableTransactions 没有任何区别。不幸的是,在完成所有这些工作之后,我发现在信号处理程序触发时网络已经关闭:)
    • 嗨,我知道已经有一段时间了,但我正在处理 macOS Sierra 和 High Sierra 中完全相同的情况。也许你知道哪个标志禁用了守护程序的突然终止?跨度>
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-07-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多