macos - 通过 launchd 在关机时运行 Shell 脚本

标签 macos shutdown launchd

由于启动项和 rc 命令在 OS X 上均已弃用(并且在许多情况下根本不起作用),取而代之的是 launchd,我想找到了解设置在注销/关闭时运行的 shell 脚本的正确方法是什么。

对于启动项,可以创建一个类似于以下内容的 shell 脚本:

#!/bin/sh
StartService() {
    echo "Started."
}

StopService() {
    echo "Stopped."
}

RunService "$1"

但是从 launchd 运行脚本时不支持 RunService 命令,而且我不确定它是否还应该再使用。

如果可能的话,我想创建一个 shell 脚本,将其作为按需服务提供给 launchd,该服务将在接近关闭时启动,并以某种方式通知系统正在关闭.

或者,我可能需要一个在登录/系统启动时打开的 shell 脚本,并保持运行(或者更确切地说,休眠),直到收到 SIGTERM 或其他终止信号,以便它可以运行关闭前的一些命令。

最佳答案

@gaige 感谢您的回复!最后我做了以下事情:

#!/bin/sh
StartService() {
    echo "Started"
}

StopService() {
    echo "Stopped"
    exit 0
}

StartService
trap StopService SIGTERM
while true; do
    sleep 86400 &
    wait $!
done

睡一整天应该可以防止它浪费任何处理能力,尽管这并不是我最喜欢的解决方案。然而,launchd实际上并没有任何看起来允许我的脚本仅在关闭时运行的标准。相反,上面的代码在加载(登录)时运行,然后在终止、注销或关闭时捕获 SIGTERM。请注意 sleep 的异步使用,因为某些环境会在执行陷阱之前等待 sleep 完成,这是不好的,因为 launchd 只允许几秒钟的响应在发送 SIGKILL 之前发送到 SIGTERM

据我所知,launchd 仅支持由套接字或监视路径或其他内容触发的按需服务,这并没有真正为我提供解决方案,因为它仍然会需要某种外部影响。

然而,一个有益的副作用是,我在 StartService 中获得的任何结果(例如文件指针等)都可以通过 StopService 轻松访问,因为它仅在内存中,无需保存文件。只是感觉不是最优雅的解决方案,但是嘿,如果它有效那就太好了!

关于macos - 通过 launchd 在关机时运行 Shell 脚本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16542301/

相关文章:

objective-c - 我的应用程序应该在哪个文件夹中写入其 launchd 文件?

macos - 启动产生新进程的流程

objective-c - 向 NSNumber 发送 intValue 消息会导致 "Bad Access"错误

macos - 覆盖 scrollWheel 函数时,NSScrollView 中的滚动停止

php - Yosemite 上的 MAMP - 连接错误 : SQLSTATE[HY000] [2002] No such file or directory

objective-c - 如何在 OS X 上以编程方式运行具有低 IO 优先级和高 niceness 值的命令

macos - 使用 CMake 自定义 MacOS Bundle 的 Info.plist 文件

java - 从 shutdownNow() 返回的 List<Runnable> 无法转换为提交的 Runnable

swift - "Order"使用 Swift 关闭 Mac

c# - 如何知道应用程序正在关闭