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

时间:2013-05-14 11:44:22

标签: macos shutdown launchd

由于启动项和rc命令在OS X上都被弃用(并且在很多情况下根本不起作用),而不是launchd,我想知道正确的方法是什么是设置一个在注销/关闭时运行的shell脚本。

对于启动项,可以创建类似于:

的shell脚本
#!/bin/sh
StartService() {
    echo "Started."
}

StopService() {
    echo "Stopped."
}

RunService "$1"

但是从RunService运行脚本时不支持launchd命令,我不确定它是否意味着再次使用。

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

或者,我可能需要一个在登录/系统启动时打开并继续运行(或者更确切地说是睡着)的shell脚本,直到收到SIGTERM或其他终止信号,这样它才能运行一些命令闭。

1 个答案:

答案 0 :(得分:1)

@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,因为有些环境会在执行陷阱之前等待睡眠完成,这是不好的,因为launchd只允许几秒钟响应SIGTERMSIGKILL发送之前。

据我所知,launchd只支持按需服务,如果它们是由套接字或观察路径或其他任何东西触发的,这对我来说并没有真正提供解决方案,因为它仍然需要某种形式外部影响。

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