Gestire programmi avvio automatico macOS con launchctl

launchctl è lo strumento integrato in macOS per controllare i processi gestiti da launchd, il sistema che avvia servizi, agenti e demoni in automatico. Il comando permette di vedere quali elementi sono attivi, leggere i dettagli dei singoli processi e individuare i file .plist che ne definiscono l’avvio. Per gestire programmi avvio automatico macOS è importante distinguere tra elementi caricati da launchd, applicazioni presenti in “Elementi login” e processi in background autorizzati dalle versioni recenti del sistema. Le operazioni più invasive richiedono prudenza e, in alcuni casi, privilegi amministrativi.

Cosa controlla davvero launchctl su macOS

launchctl gestisce i lavori di launchd, cioè servizi eseguiti in background senza una normale finestra applicativa. Questi lavori possono appartenere all’utente corrente, all’interfaccia grafica, al sistema oppure a software installati da applicazioni di terze parti.

Gli elementi di avvio automatico di macOS sono generalmente descritti da file con estensione .plist, archiviati in cartelle diverse in base al loro livello di esecuzione:

  • ~/Library/LaunchAgents contiene gli agenti avviati per l’utente corrente.
  • /Library/LaunchAgents contiene agenti disponibili per gli utenti del Mac.
  • /Library/LaunchDaemons contiene demoni di sistema eseguiti senza interfaccia grafica.
  • /System/Library/LaunchAgents contiene componenti forniti da macOS.
  • /System/Library/LaunchDaemons contiene demoni Apple protetti dal sistema.

Un file .plist presente in una di queste cartelle non indica necessariamente che il processo sia attivo in quel momento. launchd può caricare il lavoro soltanto quando serve, quando un’applicazione lo richiede o quando si verifica un evento definito nel file di configurazione.

macOS Ventura e versioni successive mostrano inoltre molti elementi in Impostazioni di Sistema > Generali > Elementi login. Quella schermata non coincide completamente con l’elenco di launchctl, perché comprende anche applicazioni aperte al login e attività in background gestite dal sistema.

Come visualizzare i programmi caricati con launchctl

Il comando più rapido per vedere i lavori caricati nel contesto dell’utente è il seguente:

launchctl list

L’output presenta normalmente tre colonne: identificativo del processo, codice di uscita e nome del servizio. Un trattino nella colonna del processo significa che il lavoro è caricato ma non sta eseguendo in quel preciso momento; un numero indica invece un processo attivo.

Per esaminare i lavori collegati alla sessione grafica dell’utente, usa:

launchctl print gui/$(id -u)

$(id -u) restituisce l’identificativo numerico dell’utente attualmente collegato. Il dominio gui/UID è particolarmente utile per gli agenti che interagiscono con il desktop, mentre user/UID identifica il dominio utente più generale:

launchctl print user/$(id -u)

I servizi di sistema appartengono al dominio system e possono essere consultati con:

sudo launchctl print system

L’uso di sudo è necessario soltanto per leggere o amministrare alcuni elementi del dominio di sistema. Non è consigliabile usare sudo con i comandi destinati al dominio grafico dell’utente, perché si rischia di interrogare il contesto dell’utente root invece della propria sessione.

Per cercare rapidamente un nome specifico nell’elenco, puoi combinare launchctl con grep:

launchctl list | grep -i nomeprogramma

Il risultato non è una prova assoluta che un’applicazione si avvii al login: mostra soltanto i lavori caricati nel dominio interrogato. Un agente configurato per essere avviato su richiesta può non comparire come processo in esecuzione.

Come trovare i file plist che avviano i programmi

Per elencare i file di configurazione presenti nelle cartelle più comuni, esegui:

find ~/Library/LaunchAgents /Library/LaunchAgents /Library/LaunchDaemons -maxdepth 1 -type f -name '*.plist' -print 2>/dev/null

Il comando esclude le cartelle protette di macOS e può richiedere sudo per visualizzare tutti i file presenti in /Library/LaunchDaemons:

sudo find /Library/LaunchAgents /Library/LaunchDaemons -maxdepth 1 -type f -name '*.plist' -print

Per leggere il contenuto di un file .plist in una forma comprensibile, utilizza plutil:

plutil -p ~/Library/LaunchAgents/com.esempio.servizio.plist

Nel file sono particolarmente importanti le chiavi seguenti:

  • Label identifica il nome del lavoro registrato da launchd.
  • Program o ProgramArguments indica il programma o il comando da eseguire.
  • RunAtLoad segnala se il lavoro deve essere avviato quando viene caricato.
  • KeepAlive può ordinare a launchd di mantenerlo attivo o riavviarlo.
  • StartInterval e StartCalendarInterval definiscono avvii periodici.
  • WatchPaths e QueueDirectories collegano l’avvio alla modifica di file o cartelle.

Il valore RunAtLoad impostato su true è un indizio importante, ma non è l’unico modo con cui un servizio può partire automaticamente. Anche KeepAlive, eventi di sistema e richieste provenienti da altre applicazioni possono causare l’avvio.

Dopo aver individuato il valore Label, puoi stampare i dettagli del singolo lavoro:

launchctl print gui/$(id -u)/com.esempio.servizio

Se il servizio appartiene al dominio utente ma non all’interfaccia grafica, prova:

launchctl print user/$(id -u)/com.esempio.servizio

Un errore come “Could not find service” indica generalmente che il lavoro non è caricato in quel dominio, non necessariamente che il file .plist sia assente.

Come disattivare o ricaricare un agente con cautela

Per gestire programmi avvio automatico macOS, è preferibile intervenire prima sull’applicazione che ha installato l’agente. Molti software offrono infatti un’opzione interna per disabilitare l’avvio, evitando modifiche manuali ai file di sistema.

Per rimuovere temporaneamente un agente dell’utente dalla sessione corrente, il comando moderno è bootout. Il percorso deve corrispondere esattamente al file .plist:

launchctl bootout gui/$(id -u) ~/Library/LaunchAgents/com.esempio.servizio.plist

Per caricare nuovamente lo stesso agente nella sessione grafica:

launchctl bootstrap gui/$(id -u) ~/Library/LaunchAgents/com.esempio.servizio.plist

Questi comandi modificano lo stato del lavoro caricato, ma non cancellano il file .plist. Un nuovo login, un riavvio o il meccanismo di caricamento dell’applicazione potrebbero quindi registrare nuovamente il servizio.

Per un demone installato a livello di sistema, il dominio e il percorso cambiano:

sudo launchctl bootout system /Library/LaunchDaemons/com.esempio.servizio.plist

Non modificare o rimuovere file dentro /System/Library/LaunchAgents e /System/Library/LaunchDaemons: sono componenti di macOS e possono essere protetti da System Integrity Protection. Disabilitare un demone Apple può causare malfunzionamenti, impedire l’avvio di funzioni integrate o generare errori dopo un aggiornamento.

Per controllare se un servizio è stato marcato come disabilitato, puoi interrogare lo stato del dominio:

launchctl print-disabled user/$(id -u)

La sintassi e il contenuto dell’output possono variare tra le versioni di macOS. Prima di intervenire, annota il percorso originale del file, il nome del servizio e l’applicazione che lo ha installato.

Quando l’obiettivo è soltanto impedire l’apertura di un’app al login, usa anche Impostazioni di Sistema > Generali > Elementi login. In macOS, questa schermata è il metodo più sicuro per gestire le applicazioni visibili all’utente, mentre launchctl è più adatto per analizzare agenti e demoni tecnici.

Potrebbe interessarti anche:

FAQ

No. launchctl list mostra i lavori caricati nel dominio interrogato. Gli elementi login, le estensioni e alcuni processi in background possono essere gestiti da componenti diversi.

Leggi le chiavi Program, ProgramArguments e Label con plutil -p. Il percorso del programma o degli argomenti indica normalmente il software responsabile.

È possibile, ma non è la scelta più sicura. Prima disattiva l’agente, crea una copia del file e verifica quale applicazione lo ha installato; non eliminare componenti presenti nelle cartelle di sistema.

bootout rimuove il lavoro dalla sessione corrente, ma non cancella il file .plist. L’applicazione proprietaria o un nuovo accesso a macOS può caricarlo di nuovo.

Un LaunchAgent opera nel contesto di un utente e può interagire con la sessione grafica. Un LaunchDaemon opera a livello di sistema e normalmente non dispone di un’interfaccia visibile.

Altri articoli di questa serie:

PDF Strumenti PDF gratis Nel browser, senza upload Apri gli strumenti