Answers:
似乎Apple对注销挂钩更换不感兴趣,因为他们关闭了我的问题查询一个。
但是,Yosemite的一项改进是现在launchd正确地将信号发送到shell脚本。这意味着您现在可以执行注销任务,如下所示:
这是logout.sh的一个例子:
#!/bin/sh
onLogout() {
echo 'Logging out' >> ~/Logs/logout.sh.log
exit
}
trap 'onLogout' SIGINT SIGHUP SIGTERM
while true; do
sleep 86400 &
wait $!
done
这将简单地休眠(异步,同步地执行而不使用&符号似乎不起作用),直到它收到一个被捕获的信号,此时它将执行 onLogout
功能。
您需要做的就是使用a启动该脚本 RunAtLoad
启动代理或启动守护程序,它将在注销或关闭时运行,但重要的是要记住,任务在被杀之前只有有限的时间来完成,所以这不应该用于运行任何东西这需要很长时间,或者需要可能延迟的网络连接等。
当然这对小牛队或之前的任何人都没有用,但在优胜美地之下,这似乎按预期工作了;所以我实际上是在第一时间做的, launchd
只是没有正确发送信号:)
注意:为了使这个工作,shell脚本似乎需要通过启动直接执行,即 - 它不应该通过调用 sh
。所以,如果它被放入 ~/Library/Scripts/foo.sh
您的程序参数可能如下所示:
<key>ProgramArguments</key>
<array>
<string>~/Library/Scripts/foo.sh</string>
<string>bar</string>
</array>
<key>EnableGlobbing</key>
<true/>
您可以使用iHook来运行登录/注销挂钩,我发现它仍适用于在Yosemite上用Bash和Python编写的非交互式登录和注销挂钩。
如果从搜索引擎到达此处的其他人不关心使用注销挂钩,请运行例如:
sudo defaults write com.apple.loginwindow LogoutHook '~/.logouthook';echo $'#!/usr/bin/env bash\n\nsay a'>~/.logouthook;chmod +x ~/.logouthook
然后 ~/.logouthook
在您下次注销时运行。
的价值 LogoutHook
key必须是可执行文件的路径,而不是shell命令。该 defaults
命令修改 /var/root/Library/Preferences/com.apple.loginwindow.plist
。
launchd
,只是一种耻辱,它没有 RunBeforeUnload
或类似的选择。
我也无法让launchd注销项在10.10.1中工作,但root的“com.apple.loginwindow.plist”中的LogoutHook键运行良好。 launchd方法还有其他任何示例吗?
无论如何,我写了一个AppleScript来在注销时杀死系统卷,这样下次启动时就不会听到启动响铃。我没有解决的是基于单个LogoutHook键管理多个注销命令的细节,或者是否可以存储多个LogoutHook键,所以我仍然对使用Lingon管理的Launchd方法感兴趣,甚至是Lingon 3,它的范围比原来的要窄得多(可能存在于App商店中)。
set current_Vol to (do shell script "osascript -e \"output volume of (get volume settings)\"") if button returned of (display dialog "Do you want to silence the startup chime, restore it, or cancel?" buttons {"Silence", "Restore", "Cancel"} default button 1) is "silence" then do shell script "mkdir -p /usr/local/logouttask;echo '#!/bin/bash # logout script osascript -e \"set volume 0\"' > /usr/local/logouttask/logoutscript;sudo defaults write com.apple.loginwindow LogoutHook /usr/local/logouttask/logoutscript;chmod +x /usr/local/logouttask/logoutscript" with administrator privileges else try do shell script "sudo defaults write com.apple.loginwindow LogoutHook '';rm /usr/local/logouttask/logoutscript" with administrator privileges display dialog "The startup chime will be heard if the volume setting is greater than 0 at shut down or restart." buttons {"OK"} default button 1 on error the error_message number the error_number if error_number is 1 then display dialog "The script that sets system volume to zero at logout doesn't exist. The startup chime will be heard if the volume setting is greater than 0 at shut down or restart." buttons {"OK"} default button 1 else display dialog "Error: " & the error_number & ". " & the error_message buttons {"OK"} default button 1 end if end try end if
sh
)所以它需要是一个可执行的文件,我会在我的回答中注意到。
line 8: syntax error near unexpected token ;'
(在分号前有一个坟墓)