由于启动项和rc
在 OS X 上,这两个命令均已弃用(并且在许多情况下根本不起作用),取而代之的是launchd
,我想知道设置在注销/关闭时运行的 shell 脚本的正确方法是什么。
对于启动项,可以创建一个类似于以下内容的 shell 脚本:
#!/bin/sh
StartService() {
echo "Started."
}
StopService() {
echo "Stopped."
}
RunService "$1"
But the RunService
运行脚本时不支持命令launchd
,而且我不确定它是否还可以再使用。
如果可能的话,我想创建一个 shell 脚本来提供给launchd
作为一项按需服务,它将在接近关闭时启动,并以某种方式通知系统正在关闭。
或者,我可能需要一个在登录/系统启动时打开的 shell 脚本,并保持运行(或者更确切地说,休眠)直到SIGTERM
或者收到其他kill信号,以便它可以在关闭之前运行一些命令。
@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
只允许几秒钟的时间来响应SIGTERM
before SIGKILL
已发送。
据我所知launchd
仅支持由套接字或监视路径或其他内容触发的按需服务,这并没有真正为我提供解决方案,因为它仍然需要某种外部影响。
然而,一个有益的副作用是,我在 StartService 中获得的任何结果(例如文件指针等)都可以通过 StopService 轻松访问,因为它仅在内存中,无需保存文件。只是感觉不是最优雅的解决方案,但是嘿,如果它有效的话那就没问题了!
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)