我想在关闭或重新启动运行 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"