O que são LaunchAgents e LaunchDaemons no Mac e quais dá para remover
LaunchAgents e LaunchDaemons são pastas de pequenos arquivos .plist que dizem ao launchd do macOS o que iniciar em segundo plano e quando. Um agent roda para um único usuário conectado e pode mostrar coisas na tela; um daemon roda para o sistema inteiro, sem interface de usuário. Em geral você pode remover os itens de terceiros de um app que não tem mais. Deixe /System/Library em paz e pare um job antes de mover o arquivo dele.
As cinco pastas
O guia do launchd da Apple lista estes locais:
| Pasta | O que guarda | Mexer |
|---|---|---|
~/Library/LaunchAgents |
Agents de terceiros só para a sua conta | Sim, com cuidado |
/Library/LaunchAgents |
Agents de terceiros para todos os usuários | Sim, com senha de administrador |
/Library/LaunchDaemons |
Daemons de sistema de terceiros | Sim, com senha de administrador |
/System/Library/LaunchAgents |
Agents da Apple | Não |
/System/Library/LaunchDaemons |
Daemons da Apple | Não |
A página man launchd traça a linha: um daemon é um serviço de todo o sistema, com uma instância para todos os clientes, e não deve exibir interface de usuário. Um agent roda por usuário, e o trabalho que interage com o usuário pertence a ele. Na prática, um auxiliar da barra de menus ou um atualizador tende a ser um agent, e um serviço de VPN, um auxiliar de driver de áudio ou um mecanismo de backup tende a ser um daemon.
Nem todo item em segundo plano tem um arquivo aqui. Os apps podem manter o plist dentro do próprio bundle, então Ajustes do Sistema › Geral › Itens de Início de Sessão e Extensões pode listar algo que estas pastas não têm. Como impedir que apps abram na inicialização trata dessa tela.
Leia um antes de julgar
ls -la ~/Library/LaunchAgents /Library/LaunchAgents /Library/LaunchDaemons
plutil -p ~/Library/LaunchAgents/com.example.helper.plist
Quatro chaves contam a maior parte da história:
| Chave | O que significa |
|---|---|
Label |
O nome do job, que é o que o launchctl usa |
Program ou ProgramArguments |
O que ele executa. Este é o caminho a conferir |
RunAtLoad |
Ele começa assim que o job carrega, em geral no login ou na inicialização |
KeepAlive |
O launchd o reinicia se ele parar, então encerrá-lo não dura |
com.example.helper acima é um exemplo, então use o nome do seu próprio arquivo. Se ProgramArguments aponta para um app que você removeu, aquele arquivo é um resto e é seguro tirá-lo. Se aponta para um app que você ainda usa, removê-lo pode quebrar as atualizações, a sincronização, o licenciamento, a VPN ou o áudio desse app.
Como remover um
Pare o job primeiro. Mover o arquivo não para um job que já está rodando, e ele continua carregado até o logout ou a reinicialização.
Para um agent na sua conta:
launchctl bootout gui/$(id -u)/com.example.helper
mv ~/Library/LaunchAgents/com.example.helper.plist ~/.Trash/
Para um daemon em /Library/LaunchDaemons:
sudo launchctl bootout system/com.example.helper
sudo mv /Library/LaunchDaemons/com.example.helper.plist ~/.Trash/
Um agent em /Library/LaunchAgents carrega na sessão de cada usuário, então pare-o com a forma gui/$(id -u)/ e mova o arquivo com sudo mv. Use o valor de Label nesses comandos, que pode ser diferente do nome do arquivo.
Confirme que sumiu com launchctl print gui/$(id -u)/com.example.helper ou sudo launchctl print system/com.example.helper, que deve informar que o serviço não foi encontrado. Depois use o app por um dia. Se algo quebrou, coloque o arquivo de volta e reinicie.
Para manter o arquivo e só impedir que o job carregue:
launchctl disable gui/$(id -u)/com.example.helper
launchctl print-disabled gui/$(id -u)
launchctl enable com o mesmo alvo desfaz isso.
O que não fazer
- Não mexa em
/System/Library/LaunchAgentsnem em/System/Library/LaunchDaemons. Elas ficam no volume de sistema somente leitura e pertencem ao macOS. - Não apague só pelo nome da empresa. Um arquivo com o nome de um produto de segurança ou de um driver de dispositivo pode ser o jeito de esse produto continuar funcionando, e em um Mac gerenciado pode ser política da empresa.
- Não remova o plist de um app que você ainda usa esperando que só o aviso de atualização suma. Confira antes o ajuste do próprio app.
- Não use guias antigos que mandam usar
launchctl unload. O manual da Apple o lista como um subcomando legado, ebootouté a forma atual.
Onde o Mole entra
A aba Apps do Mole tem um segmento Início que lista estes itens, lê o Label de cada plist e dá aos auxiliares o nome do app dono. Ela os agrupa sob títulos como Itens de início e Serviços em segundo plano, e sinaliza Programa ausente quando um job aponta para algo que não existe mais, o que é o sinal habitual de um resto. Para um plist do launchd verificado em ~/Library/LaunchAgents, /Library/LaunchAgents ou /Library/LaunchDaemons, você pode desligá-lo com o interruptor da linha, ligá-lo de novo ou movê-lo para a Lixeira, e o Mole para o job primeiro. Produtos de segurança e de gerenciamento ficam bloqueados, e os itens que ele não consegue alterar com segurança abrem os Ajustes do Sistema. Quando um processo em Status parece desconhecido, Por que está em execução? nomeia o serviço do launchd e o plist dele. Desinstalar um app pelo Mole também oferece os itens de inicialização dele para revisão.
Perguntas frequentes
É seguro apagar arquivos em LaunchAgents?
Sim para um resto de um app que você removeu, e às vezes não para um app que você ainda usa. Leia ProgramArguments com plutil -p primeiro e pare o job com launchctl bootout antes de mover o arquivo para a Lixeira, para poder recolocá-lo.
Qual é a diferença entre um LaunchAgent e um LaunchDaemon?
Um agent roda para cada usuário conectado e pode interagir com ele. Um daemon roda em todo o sistema, com uma instância, em geral antes de alguém entrar, e não tem interface de usuário.
Por que um LaunchAgent removido voltou?
O app que o instalou ainda está no Mac e o gravou de novo quando abriu ou atualizou. Desligue o recurso no app ou desinstale o app, já que remover só o arquivo não dura.
Um LaunchAgent pode ser malware?
Pode. Adware persistente costuma se instalar aqui, porque sobrevive a uma reinicialização. Um Label desconhecido que executa algo de uma pasta oculta ou de um caminho temporário merece um olhar mais atento, então pesquise o caminho exato e confira quem assinou o programa.
Preciso reiniciar depois de remover um?
Não, se você usou launchctl bootout, que o para na hora. Se você só moveu o arquivo, o job continua carregado até você sair da sessão ou reiniciar.