←→ Underneath: Background Apps · Todos os guias para Mac
Por que um app volta depois que você reinicia o Mac
Você encerrou o app. Até forçou o encerramento no Monitor de Atividade. Dois segundos depois, ou após o próximo reinício, ele está em execução de novo. Algo o está iniciando de propósito. No Mac, esse algo quase sempre é o launchd.
Resposta curta: o app tem uma tarefa do launchd. RunAtLoad a inicia a cada início de sessão, e KeepAlive a inicia de novo sempre que ela para. Encerrar o processo não altera a tarefa. Para pará-lo 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 inicia quase todo o resto. Ele lê pequenos arquivos .plist, chamados tarefas (jobs), que dizem o que executar e quando. Cada tarefa tem um label, um nome único como com.google.keystone.agent.
Os apps instalam tarefas em ~/Library/LaunchAgents, /Library/LaunchAgents ou /Library/LaunchDaemons, ou as registram de dentro do próprio pacote do app.
As chaves que trazem um app de volta
Este é um agente de inicialização 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 você vê |
|---|---|---|
RunAtLoad | Inicia a tarefa assim que ela é carregada, ou seja, a cada início de sessão (agentes) ou inicialização do Mac (daemons) | Ele está lá depois de cada reinício |
KeepAlive = true | Reinicia o processo sempre que ele termina | Forçar o encerramento não adianta; ele volta em segundos |
KeepAlive com condições | Reinicia só em alguns casos, como após uma falha (SuccessfulExit = false) ou enquanto a rede está ativa | Ele volta às vezes, não sempre |
StartInterval | É executada a cada N segundos | Ele aparece, é executado por pouco tempo, some e repete |
StartCalendarInterval | É executada em horários definidos, como o cron | Ele aparece no mesmo horário todos os dias |
WatchPaths | É executada quando um arquivo ou pasta muda | Ele aparece depois que você faz algo sem relação |
O launchd espera cerca de 10 segundos entre os reinícios de uma tarefa que continua terminando, então uma tarefa com KeepAlive também pode parecer que “pisca”.
Outros motivos para um app voltar
- Abrir ao Iniciar Sessão. O app está em Ajustes do Sistema › Geral › Itens de Início e Extensões. O macOS o abre a cada início de sessão.
- Reabrir janelas ao iniciar sessão novamente. A caixa na caixa de diálogo Reiniciar e Desligar restaura todos os apps que estavam abertos.
- O app se adiciona de novo. O próprio ajuste “Abrir ao iniciar sessão” dele o registra de novo toda vez que ele é executado.
- Um processo auxiliar abre o app principal. Um pequeno processo auxiliar em segundo plano inicia primeiro e depois abre o app completo, por exemplo para mostrar o status da sincronização.
- Serviços do Homebrew.
brew services startgrava um agente de inicialização comRunAtLoad. Pare-o combrew services stop <name>.
Descubra qual deles é
- Encontre o label da tarefa. Execute
launchctl list | grep -i example, usando parte do nome do app ou do desenvolvedor. A terceira coluna é o label. - Leia a tarefa:
Procurelaunchctl print gui/$(id -u)/com.example.helperpath(o arquivo plist),state,runs(quantas vezes iniciou) elast exit code. Um número alto de execuções normalmente indicaKeepAlive. - Abra o plist e verifique
RunAtLoad,KeepAlivee as chaves de intervalo. - Se não houver nenhuma tarefa, verifique Abrir ao Iniciar Sessão e os ajustes do próprio app.
Parar ou desativar
| O que você faz | Volta? |
|---|---|
| Encerrar ou forçar o encerramento do processo | Sim: na hora 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é você executar launchctl enable |
| Mover o plist para fora de LaunchAgents + bootout | Não, até você colocá-lo de volta |
| Desativar em Permitir em Segundo Plano | Não, até você ativar de novo |
Os comandos passo a passo estão em como desativar agentes de inicialização com segurança.
FAQ
Por que um processo reinicia logo depois que o encerro no Monitor de Atividade?
A tarefa do launchd dele tem KeepAlive definido. O launchd vigia o processo e o inicia de novo quando ele termina. Pare a tarefa com launchctl bootout em vez de encerrar o processo.
O que significa RunAtLoad?
RunAtLoad é uma chave de um plist do launchd. Quando ela é true, o launchd inicia a tarefa assim que carrega o plist, o que, para um agente de inicialização, significa toda vez que você inicia sessão.
O que significa KeepAlive?
KeepAlive diz ao launchd para manter a tarefa em execução. Se o processo terminar ou for encerrado à força, o launchd o inicia de novo. Também pode ser um conjunto de condições, como reiniciar somente após uma falha.
Qual é a diferença entre parar e desativar um agente de inicialização?
Parar (launchctl bootout) descarrega a tarefa até o próximo início de sessão ou reinício. Desativar (launchctl disable, ou mover o plist para fora de LaunchAgents) impede que ela seja carregada de novo depois de reiniciar.