←→ Underneath: Background Apps · Tutte le guide per Mac

Perché un'app torna dopo il riavvio del Mac

Sei uscito dall'app. Hai persino forzato l'uscita in Monitoraggio Attività. Due secondi dopo, o dopo il riavvio successivo, è di nuovo in esecuzione. Qualcosa la sta avviando di proposito. Su un Mac, quel qualcosa è quasi sempre launchd.

In breve: l'app ha un job di launchd. RunAtLoad la avvia a ogni login, e KeepAlive la riavvia ogni volta che si ferma. Chiudere il processo non cambia il job. Per fermarla definitivamente, disattiva il job, non il processo.

Cos'è launchd

launchd è il primo processo che macOS avvia (ID di processo 1). Avvia quasi tutto il resto. Legge piccoli file .plist, chiamati job, che indicano cosa eseguire e quando. Ogni job ha un'etichetta (label), un nome univoco come com.google.keystone.agent.

Le app installano job in ~/Library/LaunchAgents, /Library/LaunchAgents o /Library/LaunchDaemons, oppure li registrano dall'interno del proprio bundle.

Le chiavi che fanno tornare un'app

Ecco un tipico agente di avvio:

<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/>
ChiaveEffettoCosa vedi
RunAtLoadAvvia il job appena viene caricato, cioè a ogni login (agenti) o all'accensione (daemon)È presente dopo ogni riavvio
KeepAlive = trueRiavvia il processo ogni volta che terminaL'uscita forzata non serve a nulla; torna in pochi secondi
KeepAlive con condizioniRiavvia solo in alcuni casi, per esempio dopo un arresto anomalo (SuccessfulExit = false) o finché la rete è attivaTorna a volte, non sempre
StartIntervalViene eseguito ogni N secondiCompare, funziona per poco, sparisce, e si ripete
StartCalendarIntervalViene eseguito a orari fissi, come cronCompare ogni giorno alla stessa ora
WatchPathsViene eseguito quando cambia un file o una cartellaCompare dopo che fai qualcosa di apparentemente scollegato

launchd attende circa 10 secondi tra un riavvio e l'altro di un job che continua a terminare, quindi un job con KeepAlive può anche sembrare che «lampeggi».

Altri motivi per cui un'app torna

Scopri qual è

  1. Trova l'etichetta del job. Esegui launchctl list | grep -i example, usando parte del nome dell'app o dello sviluppatore. La terza colonna è l'etichetta.
  2. Leggi il job:
    launchctl print gui/$(id -u)/com.example.helper
    Cerca path (il file plist), state, runs (quante volte è stato avviato) e last exit code. Un numero di avvii elevato di solito indica KeepAlive.
  3. Apri il plist e controlla RunAtLoad, KeepAlive e le chiavi di intervallo.
  4. Se non c'è alcun job, controlla Apri al login e le impostazioni dell'app stessa.

Interrompere o disattivare

Cosa faiTorna?
Esci o forzi l'uscita dal processoSì: subito con KeepAlive, al login successivo con RunAtLoad
launchctl bootout gui/$(id -u)/labelNon subito. Sì al login successivo con RunAtLoad
launchctl disable gui/$(id -u)/label + bootoutNo, finché non esegui launchctl enable
Sposti il plist fuori da LaunchAgents + bootoutNo, finché non lo rimetti a posto
Lo disattivi in Consenti in backgroundNo, finché non lo riattivi

I comandi passo passo sono in come disattivare gli agenti di avvio in sicurezza.

FAQ

Perché un processo si riavvia subito dopo che l'ho chiuso in Monitoraggio Attività?

Il suo job di launchd ha KeepAlive impostato. launchd sorveglia il processo e lo riavvia quando termina. Interrompi il job con launchctl bootout invece di chiudere il processo.

Cosa significa RunAtLoad?

RunAtLoad è una chiave di un plist di launchd. Quando vale true, launchd avvia il job non appena carica il plist, il che per un agente di avvio significa ogni volta che esegui il login.

Cosa significa KeepAlive?

KeepAlive dice a launchd di mantenere il job in esecuzione. Se il processo termina o viene terminato, launchd lo riavvia. Può anche essere un insieme di condizioni, per esempio riavviare solo dopo un arresto anomalo.

Che differenza c'è tra interrompere e disattivare un agente di avvio?

Interrompere (launchctl bootout) scarica il job fino al login o al riavvio successivo. Disattivare (launchctl disable, oppure spostare il plist fuori da LaunchAgents) impedisce che venga caricato di nuovo dopo un riavvio.