【问题标题】:Running a Shell Script on Shutdown via launchd通过 launchd 在关机时运行 Shell 脚本
【发布时间】:2013-05-14 11:44:21
【问题描述】:

由于启动项和rc 命令在 OS X 上都被弃用(并且在许多情况下根本不起作用)以支持launchd,我想找出正确的方法是设置在注销/关机时运行的 shell 脚本。

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

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

StopService() {
    echo "Stopped."
}

RunService "$1"

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

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

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

【问题讨论】:

标签: macos shutdown launchd


【解决方案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 在发送SIGKILL 之前只允许几秒钟来响应SIGTERM .

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

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

【讨论】:

    猜你喜欢
    • 2017-08-11
    • 1970-01-01
    • 2020-11-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-27
    • 2016-03-08
    相关资源
    最近更新 更多