Fazer um script / aplicativo ser executado ao sair

13

Todos sabemos que o Mac OS X tem a funcionalidade muito útil de itens de login , que permite, entre outras coisas, configurar aplicativos / scripts para serem executados quando você fizer login.

Estou procurando uma maneira de configurar uma lista de scripts / aplicativos executados quando eu sair . Uma lista "Itens de logout", se desejar.
Basicamente, quero escrever alguns scripts de limpeza para mim que serão executados automaticamente quando eu sair ou desligar.

Então, estou procurando uma maneira de ter um script (ou, idealmente, a lista deles) acionado automaticamente quando eu sair. O logout aguardaria a conclusão dos scripts (assim como o logout espera que você clique em Salvar se um aplicativo solicitar).

Existe uma maneira de acionar automaticamente um script quando eu sair do Mac OS X?

Nathan Greenstein
fonte

Respostas:

7

Os ganchos de logout foram descontinuados na 10.4 , mas ainda funcionam a partir da 10.9.

sudo defaults write com.apple.loginwindow LogoutHook ~/.logouthook
echo $'#!/bin/bash\nsay a' > ~/.logouthook
chmod +x ~/.logouthook

O valor da chave LogoutHook pode ser apenas um caminho para um executável e não um comando shell. O gancho de logout é executado como raiz.

O comando padrão modifica /var/root/Library/Preferences/com.apple.loginwindow.plist. Adicionar uma chave LogoutHook a /Library/Preferences/com.apple.loginwindow.plist não funciona.

Se um gancho de logout demorar o suficiente para ser executado, uma tela cinza será exibida até que o gancho de logoff termine. Não parece haver nenhum limite de tempo após o qual os ganchos de logout são forçados a terminar.

Eu não descobri nenhuma maneira de executar programas no logout de forma confiável com o launchd. Quando tentei capturar sinais como EXIT, o código no trap só era executado quando eu saí da janela de login e não quando eu desliguei ou reiniciei.

<?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>
Lri
fonte
Hmm, nenhum desses funcionou para mim. Eu tenho esse script , que funciona se eu executá-lo sh(ele cria esse arquivo .txt). Salvei o script como /etc/rc.shutdown.local e o adicionei defaultscomo você disse. Nenhum dos arquivos já estava lá. Estou fazendo algo errado? Obrigado!
Nathan Greenstein
Não tenho certeza se estou fazendo algo errado ou não. Estou no 10.6.8 e o LogoutHook não está funcionando. Eu apreciaria se você pudesse dar uma olhada nesta captura de tela e me informar se algo parece errado. Obrigado!
Nathan Greenstein
1
Ah! Esse último fez o truque em 10.6.8. Obrigado! Uma observação, porém: ele não funciona com o Lion :(
Nathan Greenstein
2
Ambos os métodos funcionam bem na minha máquina Mountain Lion (10.8.2), mesmo ao desligar ou reiniciar. Observe que os ganchos LoginHook / LogoutHook são executados no contexto do usuário raiz , e são ganchos únicos em todo o sistema e que o gancho de logon é executado de forma síncrona - muito antes dos agentes de inicialização por usuário; da mesma forma, o gancho de logoff é executado antes de um agente de inicialização por usuário que usa o método EXIT-trap. Há casos em que apenas os ganchos funcionam; por exemplo, se você quiser silenciar o som no desligamento para suprimir o som de inicialização do Mac, apenas o LogoutHook funcionará de maneira confiável.
mklement0
1

Na verdade, existe uma maneira:

  1. Abra o aplicativo "Script Editor"
  2. Colar

do shell script "PUT YOUR START SCRIPT PATH HERE"

on quit
    do shell script "PUT YOUR STOP SCRIPT PATH HERE"
    continue quit
end quit
  1. Arquivo> Salvar, selecione Aplicativo e mantenha-se aberto após executar o manipulador e Salvar
  2. Preferências do sistema> Usuários e grupos> guia Itens de login> botão +
  3. Adicione o aplicativo e marque-o como Oculto

Para ocultá-lo do Dock:

  1. Clique com o botão direito do mouse no aplicativo e selecione Mostrar conteúdo do pacote
  2. Abra Info.plist e adicione

<key>NSUIElement</key>
<string>1</string>
filippo
fonte
Amo isso. Simples e adequado às minhas necessidades. E não obsoleto.
Ivan X
0

O Script Timer é uma boa opção para isso. Pode ser executado no logout, logon e muito mais. Eu iria com isso para uma solução simples e fácil de usar. Possui uma GUI simples:

Ação acionada

Há duas coisas que você precisa observar sobre o Script Timer. Um deles, que é não livre. Custa 12 dólares, mas pessoalmente acho que vale a pena. Segundo, não é totalmente compatível com o Lion, mas eles prometeram uma atualização gratuita assim que a tornaram compatível.

daviesgeek
fonte
1
Esta é obsoleto agora
Kirtikumar A.
0

Você também pode criar um aplicativo para Mac a partir do seu script usando algo como Platypus e adicioná-lo aos itens de login como qualquer outro aplicativo.

svth
fonte
0

O Power Manager pode executar um script quando um usuário efetua logout. Este é um produto comercial e suporta o mais recente macOS.

O Power Manager executa um script ao sair da tarefa do Assistente de Agendamento

Versões anteriores necessárias usando o editor de eventos , mas agora uma tarefa do Assistente de Agendamento está incluída para executar scripts no logon e logout.

Escrevi o Power Manager, fique à vontade para fazer perguntas técnicas sobre sua implementação. No caso de eventos acionados por logoff, o Power Manager não pesquisa alterações no estado do usuário, mas é notificado sobre as alterações do usuário pelo macOS. Essa abordagem é mais eficiente do que ter um script em loop / sondagem.

Graham Miln
fonte