Parece que a Apple não está interessada em uma substituição do gancho de logout, pois eles fecharam meu problema perguntando sobre um.
No entanto, uma das melhorias no Yosemite é que o launchd agora envia corretamente sinais para scripts shell. O que isso significa é que agora você pode executar uma tarefa de logoff da seguinte maneira:
Aqui está um exemplo 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
Isso simplesmente dorme (de forma assíncrona, fazê-lo de forma síncrona sem o e comercial não parece funcionar) até receber um dos sinais interceptados, quando executará a onLogout
função.
Tudo o que você precisa fazer é iniciar esse script usando um RunAtLoad
agente de inicialização ou daemon de inicialização e ele será executado no logout ou desligamento, embora seja importante ter em mente que as tarefas têm apenas um período de tempo limitado para serem concluídas antes de serem mortas. , portanto, isso não deve ser usado para executar nada que demore muito ou exija uma conexão de rede que possa atrasar etc.
É claro que isso não serve para ninguém no Mavericks ou antes, mas sob Yosemite isso agora parece funcionar como esperado; então eu estava realmente fazendo certo, em primeiro lugar, launchd
simplesmente não estava enviando os sinais corretamente :)
NOTA: Para que isso funcione, os scripts do shell parecem precisar ser executados diretamente pelo lançamento, ou seja, não devem ser chamados via sh
. Portanto, se ele tiver sido colocado no ~/Library/Scripts/foo.sh
seu programa, os argumentos podem se parecer com:
<key>ProgramArguments</key>
<array>
<string>~/Library/Scripts/foo.sh</string>
<string>bar</string>
</array>
<key>EnableGlobbing</key>
<true/>
line 8: syntax error near unexpected token ;'
(com uma grave antes do ponto e vírgula)Você pode usar o iHook para executar ganchos de logon / logout, que eu descobri que ainda funcionam para ganchos de logon e logoff não interativos escritos em Bash e Python no Yosemite.
http://rsug.itd.umich.edu/software/ihook/
fonte
Se outras pessoas que chegam dos mecanismos de busca não se importam em usar um gancho de logout, execute, por exemplo:
sudo defaults write com.apple.loginwindow LogoutHook '~/.logouthook';echo $'#!/usr/bin/env bash\n\nsay a'>~/.logouthook;chmod +x ~/.logouthook
Em seguida,
~/.logouthook
é executado na próxima vez que você sair.O valor da
LogoutHook
chave deve ser um caminho para um comando executável e não um shell. Odefaults
comando é modificado/var/root/Library/Preferences/com.apple.loginwindow.plist
.fonte
launchd
, apenas uma pena que não tenhaRunBeforeUnload
ou opção semelhante .Também não consigo que o item launchd logout funcione na 10.10.1, mas a chave LogoutHook no "com.apple.loginwindow.plist" do root funciona bem. Existem outros exemplos para o método launchd?
De qualquer forma, escrevi um AppleScript para eliminar o volume do sistema no logout, para que o toque da inicialização não seja ouvido na próxima inicialização. O que ainda não descobri são os detalhes para gerenciar vários comandos de logout com base em uma única chave LogoutHook ou se é possível armazenar várias chaves LogoutHook, por isso ainda estou interessado no método Launchd, que pode ser gerenciado com o Lingon, ou mesmo o Lingon 3, que tem um escopo muito mais restrito que o original (presumivelmente existe na App Store).
fonte
sh
), portanto ele precisa ser um arquivo executável, observarei isso na minha resposta.