←→ 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/>
| Chiave | Effetto | Cosa vedi |
|---|---|---|
RunAtLoad | Avvia il job appena viene caricato, cioè a ogni login (agenti) o all'accensione (daemon) | È presente dopo ogni riavvio |
KeepAlive = true | Riavvia il processo ogni volta che termina | L'uscita forzata non serve a nulla; torna in pochi secondi |
KeepAlive con condizioni | Riavvia solo in alcuni casi, per esempio dopo un arresto anomalo (SuccessfulExit = false) o finché la rete è attiva | Torna a volte, non sempre |
StartInterval | Viene eseguito ogni N secondi | Compare, funziona per poco, sparisce, e si ripete |
StartCalendarInterval | Viene eseguito a orari fissi, come cron | Compare ogni giorno alla stessa ora |
WatchPaths | Viene eseguito quando cambia un file o una cartella | Compare 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
- Apri al login. L'app è in Impostazioni di Sistema › Generali › Elementi login ed estensioni. macOS la apre a ogni login.
- Riapri le finestre al successivo login. Questa casella nella finestra Riavvia e Spegni ripristina tutte le app che erano aperte.
- L'app si aggiunge di nuovo da sola. La sua impostazione «Avvia al login» la registra di nuovo ogni volta che viene eseguita.
- Un processo di supporto apre l'app principale. Un piccolo processo di supporto in background si avvia per primo e poi apre l'app completa, per esempio per mostrare lo stato della sincronizzazione.
- Servizi Homebrew.
brew services startscrive un agente di avvio conRunAtLoad. Interrompilo conbrew services stop <name>.
Scopri qual è
- 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. - Leggi il job:
Cercalaunchctl print gui/$(id -u)/com.example.helperpath(il file plist),state,runs(quante volte è stato avviato) elast exit code. Un numero di avvii elevato di solito indicaKeepAlive. - Apri il plist e controlla
RunAtLoad,KeepAlivee le chiavi di intervallo. - Se non c'è alcun job, controlla Apri al login e le impostazioni dell'app stessa.
Interrompere o disattivare
| Cosa fai | Torna? |
|---|---|
| Esci o forzi l'uscita dal processo | Sì: subito con KeepAlive, al login successivo con RunAtLoad |
launchctl bootout gui/$(id -u)/label | Non subito. Sì al login successivo con RunAtLoad |
launchctl disable gui/$(id -u)/label + bootout | No, finché non esegui launchctl enable |
| Sposti il plist fuori da LaunchAgents + bootout | No, finché non lo rimetti a posto |
| Lo disattivi in Consenti in background | No, 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.