Answers:
注销挂钩在10.4中已弃用,但从10.9开始它们仍然可以使用。
sudo defaults write com.apple.loginwindow LogoutHook ~/.logouthook
echo $'#!/bin/bash\nsay a' > ~/.logouthook
chmod +x ~/.logouthook
LogoutHook键的值只能是可执行文件的路径,而不能是Shell命令。注销钩子以root用户身份运行。
默认命令修改/var/root/Library/Preferences/com.apple.loginwindow.plist。将LogoutHook键添加到/Library/Preferences/com.apple.loginwindow.plist无效。
如果注销挂钩需要足够长的时间才能运行,则会显示灰色屏幕,直到注销挂钩终止。似乎没有任何时间限制注销挂钩被迫终止之后。
我还没有找到任何方法可以在启动时可靠地注销时运行程序。当我尝试捕获诸如EXIT之类的信号时,陷阱中的代码仅在我登录到登录窗口时才运行,而不是在我关闭或重新启动时才运行。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Label</key>
<string>test</string>
<key>ProgramArguments</key>
<array>
<string>bash</string>
<string>-c</string>
<string>trap 'echo a>/Users/username/Desktop/a;say a' EXIT;while :;do sleep 10;done</string>
</array>
<key>RunAtLoad</key>
<true/>
</dict>
</plist>
实际上有一种方法:
do shell script "PUT YOUR START SCRIPT PATH HERE"
on quit
do shell script "PUT YOUR STOP SCRIPT PATH HERE"
continue quit
end quit
要将其隐藏在Dock中:
<key>NSUIElement</key>
<string>1</string>
脚本计时器是一个不错的选择。它可以在注销,登录等运行。我会选择一个简单易用的解决方案。它具有一个简单的GUI:
关于脚本计时器,需要注意两件事。一,它不是免费的。它的价格为12美元,但我个人认为值得。第二,它与Lion并不完全兼容,但是他们承诺一旦兼容就可以免费更新。
用户注销时,Power Manager可以运行脚本。这是一种商业产品,它支持最新的macOS。
较早的版本需要使用事件编辑器,但现在包含了Schedule Assistant任务,用于在登录和注销时运行脚本。
我写了Power Manager,所以随时可以询问有关其实现的技术问题。在注销触发事件的情况下,Power Manager不会轮询用户状态的更改,而是会通过macOS通知用户更改。这种方法比使用脚本循环/轮询更有效。