首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >通过launchd在关机时运行Shell脚本

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

Stack Overflow用户
提问于 2013-05-14 19:44:22
回答 1查看 6K关注 1票数 2

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

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

代码语言:javascript
运行
复制
#!/bin/sh
StartService() {
    echo "Started."
}

StopService() {
    echo "Stopped."
}

RunService "$1"

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

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

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

EN

回答 1

Stack Overflow用户

发布于 2013-05-15 20:02:21

@gaige感谢你的回复!最后,我选择了以下几点:

代码语言:javascript
运行
复制
#!/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只允许在发送SIGTERM之前几秒钟响应SIGKILL

据我所知,launchd只支持按需服务,如果它们是由套接字或监视路径或其他什么触发的,这对我来说并不是一个真正的解决方案,因为它仍然需要某种外部影响。

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16542301

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档