如何使用 Snow Leopard 在关机时运行脚本?

如何使用 Snow Leopard 在关机时运行脚本?

我想在关闭或重新启动运行 Snow Leopard 的 iMac 时运行一个脚本。

我读到过一些文章说可以使用 /etc/rc.shutdown.local 来实现这一点,但是对我来说它不起作用。

例如,我把以下几行放在上面:

#!/bin/sh
/usr/bin/osascript -e "set volume with output muted"

如果我运行:

source /etc/rc.shutdown.local

它确实会静音。但是,如果我打开声音并重新启动操作系统,声音仍然会打开。我猜这意味着脚本没有被调用。

有任何想法吗?

更新:它现在确实可以工作了。我认为这只是因为正确的名称是 rc.local.shutdown 而不是 rc.shutdown.local。

答案1

它现在确实可以工作了。我认为这只是因为正确的名称是 rc.local.shutdown 而不是 rc.shutdown.local。

答案2

另一个选择是使用注销钩子:

sudo defaults write com.apple.loginwindow LogoutHook ~/.logouthook
echo $'#!/usr/bin/osascript\nset volume with output muted' > ~/.logouthook
chmod +x ~/.logouthook

LogoutHook 键的值只能是可执行文件的路径,而不能是 shell 命令。注销钩子以超级用户权限运行,因此您不需要 sudo。

defaults 命令会修改 /var/root/Library/Preferences/com.apple.loginwindow.plist。向 /Library/Preferences/com.apple.loginwindow.plist 添加 LogoutHook 键不起作用。

如果注销钩子运行时间过长,则会显示灰色屏幕,直到注销钩子终止。似乎没有任何时间限制,在此时间之后注销钩子将被强制终止。

注销钩子在 10.4 中被弃用了,但我还没有找到任何方法使用 launchd 在注销时可靠地运行程序。我不知道有什么方法可以在关机或重启之前运行注销钩子,但在注销之前不行。

答案3

使用以下脚本:

#!/usr/bin/env bash
trap 'osascript -e "say \"hello\""' TERM
while true; do
    sleep 10
done

cron通过或启动它launchd,无论你喜欢哪种方式。

尝试使用 来终止它kill pid,这pid是您从中了解到的它的进程 ID ps ax


我现在不想关机来正确测试它,但是应该工作。

答案4

首先我要声明,我是 AppleScript 的菜鸟。因此,为了让其他刚入门的人受益,我发布了以下内容,这是作者所写内容的细微变化。

#!/bin/sh
/usr/bin/osascript -e "set volume 0.5"

相关内容