←→ 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/>
ChaveEfeitoO que você vê
RunAtLoadInicia 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 = trueReinicia o processo sempre que ele terminaForçar o encerramento não adianta; ele volta em segundos
KeepAlive com condiçõesReinicia só em alguns casos, como após uma falha (SuccessfulExit = false) ou enquanto a rede está ativaEle volta às vezes, não sempre
StartIntervalÉ executada a cada N segundosEle aparece, é executado por pouco tempo, some e repete
StartCalendarIntervalÉ executada em horários definidos, como o cronEle aparece no mesmo horário todos os dias
WatchPathsÉ executada quando um arquivo ou pasta mudaEle 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

Descubra qual deles é

  1. 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.
  2. Leia a tarefa:
    launchctl print gui/$(id -u)/com.example.helper
    Procure path (o arquivo plist), state, runs (quantas vezes iniciou) e last exit code. Um número alto de execuções normalmente indica KeepAlive.
  3. Abra o plist e verifique RunAtLoad, KeepAlive e as chaves de intervalo.
  4. 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ê fazVolta?
Encerrar ou forçar o encerramento do processoSim: na hora se tiver KeepAlive, no próximo início de sessão se tiver RunAtLoad
launchctl bootout gui/$(id -u)/labelAgora não. Sim no próximo início de sessão se tiver RunAtLoad
launchctl disable gui/$(id -u)/label + bootoutNão, até você executar launchctl enable
Mover o plist para fora de LaunchAgents + bootoutNão, até você colocá-lo de volta
Desativar em Permitir em Segundo PlanoNã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.