←→ 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/>
ChaveEfeitoO que vê
RunAtLoadInicia 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 = trueReinicia o processo sempre que terminaForçar a saída não serve de nada; volta em segundos
KeepAlive com condiçõesReinicia apenas em alguns casos, como após uma falha (SuccessfulExit = false) ou enquanto a rede está ativaVolta às vezes, não sempre
StartIntervalÉ executada a cada N segundosAparece, é executada durante pouco tempo, desaparece e repete
StartCalendarIntervalÉ executada a horas definidas, como o cronAparece à mesma hora todos os dias
WatchPathsÉ executada quando um ficheiro ou pasta mudaAparece 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

Descobrir qual deles é

  1. 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.
  2. Leia a tarefa:
    launchctl print gui/$(id -u)/com.example.helper
    Procure path (o ficheiro plist), state, runs (quantas vezes arrancou) e last exit code. Um número elevado de execuções indica normalmente 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 as definições da própria app.

Parar ou desativar

O que fazVolta?
Terminar ou forçar a saída do processoSim: de imediato 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é executar launchctl enable
Mover o plist para fora de LaunchAgents + bootoutNão, até o voltar a pôr no lugar
Desativar em Permitir em segundo planoNã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.