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)