2013-05-14 76 views
2

由于启动项目和rc命令在OS X上都被弃用(并且在许多情况下根本无法工作),因此受到launchd的支持,我想知道哪些方法是正确的可以设置一个在注销/关机时运行的shell脚本。通过launchd在关机时运行Shell脚本

对于一个启动项有可能创建一个看起来像一个shell脚本:

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

StopService() { 
    echo "Stopped." 
} 

RunService "$1" 

但从launchd运行脚本时不支持RunService命令,我不知道这是无论如何,这意味着已经被使用了。

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

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

+1

查看(http://apple.stackexchange.com/questions/16825/make-a-script-app-run-on-logout)查看类似的答案,并且“man launchd.plist”提供了有关变体的详细信息您可以使用。请注意手册页的**期望**部分。 – gaige 2013-05-14 12:30:17

回答

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轻松访问,因为它只是在内存中,不需要文件保存。只是不觉得是最优雅的解决方案,但嘿,如果它工作的很好!