←→ Underneath: Background Apps · Todos os guias para Mac
Porque é que uma app volta depois de reiniciar o Mac
Saiu da app. Até forçou a saída no Monitor de Atividade. Dois segundos depois, ou após o reinício seguinte, está outra vez em execução. Algo a está a iniciar de propósito. Num Mac, esse algo é quase sempre o launchd.
Resposta curta: a app tem uma tarefa do launchd. RunAtLoad inicia-a em cada início de sessão, e KeepAlive volta a iniciá-la sempre que para. Terminar o processo não altera a tarefa. Para a parar de vez, desative a tarefa, não o processo.
O que é o launchd
O launchd é o primeiro processo que o macOS inicia (ID de processo 1). É ele que inicia quase tudo o resto. Lê pequenos ficheiros .plist, chamados tarefas (jobs), que dizem o que executar e quando. Cada tarefa tem um label, um nome único como com.google.keystone.agent.
As apps instalam tarefas em ~/Library/LaunchAgents, /Library/LaunchAgents ou /Library/LaunchDaemons, ou registam-nas a partir do seu próprio pacote.
As chaves que trazem uma app de volta
Este é um agente de arranque típico:
<key>Label</key>
<string>com.example.helper</string>
<key>ProgramArguments</key>
<array>
<string>/Applications/Example.app/Contents/MacOS/Helper</string>
</array>
<key>RunAtLoad</key>
<true/>
<key>KeepAlive</key>
<true/>
| Chave | Efeito | O que vê |
|---|---|---|
RunAtLoad | Inicia a tarefa assim que é carregada, ou seja, em cada início de sessão (agentes) ou arranque do Mac (daemons) | Está lá depois de cada reinício |
KeepAlive = true | Reinicia o processo sempre que termina | Forçar a saída não serve de nada; volta em segundos |
KeepAlive com condições | Reinicia apenas em alguns casos, como após uma falha (SuccessfulExit = false) ou enquanto a rede está ativa | Volta às vezes, não sempre |
StartInterval | É executada a cada N segundos | Aparece, é executada durante pouco tempo, desaparece e repete |
StartCalendarInterval | É executada a horas definidas, como o cron | Aparece à mesma hora todos os dias |
WatchPaths | É executada quando um ficheiro ou pasta muda | Aparece depois de fazer algo sem relação |
O launchd espera cerca de 10 segundos entre os reinícios de uma tarefa que está sempre a terminar, por isso uma tarefa com KeepAlive também pode parecer que “pisca”.
Outros motivos para uma app voltar
- Abrir ao iniciar sessão. A app está em Definições do Sistema › Geral › Elementos de início de sessão e extensões. O macOS abre-a em cada início de sessão.
- Reabrir janelas ao iniciar sessão novamente. A opção na caixa de diálogo Reiniciar e Desligar restaura todas as apps que estavam abertas.
- A app volta a adicionar-se. A sua própria definição “Abrir ao iniciar sessão” volta a registá-la sempre que é executada.
- Um processo auxiliar abre a app principal. Um pequeno processo auxiliar em segundo plano arranca primeiro e depois abre a app completa, por exemplo para mostrar o estado da sincronização.
- Serviços do Homebrew.
brew services startescreve um agente de arranque comRunAtLoad. Pare-o combrew services stop <name>.
Descobrir qual deles é
- Encontre o label da tarefa. Execute
launchctl list | grep -i example, usando parte do nome da app ou do programador. A terceira coluna é o label. - Leia a tarefa:
Procurelaunchctl print gui/$(id -u)/com.example.helperpath(o ficheiro plist),state,runs(quantas vezes arrancou) elast exit code. Um número elevado de execuções indica normalmenteKeepAlive. - Abra o plist e verifique
RunAtLoad,KeepAlivee as chaves de intervalo. - Se não houver nenhuma tarefa, verifique Abrir ao iniciar sessão e as definições da própria app.
Parar ou desativar
| O que faz | Volta? |
|---|---|
| Terminar ou forçar a saída do processo | Sim: de imediato se tiver KeepAlive, no próximo início de sessão se tiver RunAtLoad |
launchctl bootout gui/$(id -u)/label | Agora não. Sim no próximo início de sessão se tiver RunAtLoad |
launchctl disable gui/$(id -u)/label + bootout | Não, até executar launchctl enable |
| Mover o plist para fora de LaunchAgents + bootout | Não, até o voltar a pôr no lugar |
| Desativar em Permitir em segundo plano | Não, até o voltar a ativar |
Os comandos passo a passo estão em como desativar agentes de arranque em segurança.
FAQ
Porque é que um processo reinicia logo depois de o terminar no Monitor de Atividade?
A respetiva tarefa do launchd tem KeepAlive definido. O launchd vigia o processo e volta a iniciá-lo quando termina. Pare a tarefa com launchctl bootout em vez de terminar o processo.
O que significa RunAtLoad?
RunAtLoad é uma chave de um plist do launchd. Quando é true, o launchd inicia a tarefa assim que carrega o plist, o que, para um agente de arranque, significa sempre que inicia sessão.
O que significa KeepAlive?
KeepAlive diz ao launchd para manter a tarefa em execução. Se o processo terminar ou for terminado à força, o launchd volta a iniciá-lo. Também pode ser um conjunto de condições, como reiniciar apenas após uma falha.
Qual é a diferença entre parar e desativar um agente de arranque?
Parar (launchctl bootout) descarrega a tarefa até ao próximo início de sessão ou reinício. Desativar (launchctl disable, ou mover o plist para fora de LaunchAgents) impede que volte a ser carregada depois de reiniciar.