Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Macos 通过launchd在关机时运行Shell脚本_Macos_Shutdown_Launchd - Fatal编程技术网

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

Macos 通过launchd在关机时运行Shell脚本,macos,shutdown,launchd,Macos,Shutdown,Launchd,由于OSX上的启动项和rc命令都不赞成使用launchd,因此我想了解设置在注销/关闭时运行的shell脚本的正确方法 对于启动项,可以创建类似以下内容的shell脚本: #!/bin/sh StartService() { echo "Started." } StopService() { echo "Stopped." } RunService "$1" 但是从launchd运行脚本时,RunService命令不受支持,而且我不确定它是否还要继续使用 如果可能的话,我想

由于OSX上的启动项和
rc
命令都不赞成使用
launchd
,因此我想了解设置在注销/关闭时运行的shell脚本的正确方法

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

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

StopService() {
    echo "Stopped."
}

RunService "$1"
但是从
launchd
运行脚本时,
RunService
命令不受支持,而且我不确定它是否还要继续使用

如果可能的话,我想创建一个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
在发送
SIGKILL
之前只允许几秒钟对
SIGTERM
作出响应是不好的

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

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

查看()以获得类似的答案,
man launchd.plist
提供了有关您可以使用的变体的详细信息。请注意手册页的期望部分。