←→ Underneath: Background Apps · Tous les guides Mac

Pourquoi une app revient après le redémarrage de votre Mac

Vous l'avez quittée. Vous l'avez même forcée à quitter dans le Moniteur d'activité. Deux secondes plus tard, ou après le redémarrage suivant, elle tourne de nouveau. Quelque chose la démarre volontairement. Sur un Mac, ce quelque chose est presque toujours launchd.

En bref : l'app a une tâche launchd. RunAtLoad la démarre à chaque connexion, et KeepAlive la relance chaque fois qu'elle s'arrête. Quitter le processus ne change pas la tâche. Pour l'arrêter définitivement, désactivez la tâche, pas le processus.

Ce qu'est launchd

launchd est le premier processus que démarre macOS (identifiant de processus 1). Il démarre presque tout le reste. Il lit de petits fichiers .plist, appelés tâches (jobs), qui indiquent quoi exécuter et quand. Chaque tâche a un label, un nom unique comme com.google.keystone.agent.

Les apps installent des tâches dans ~/Library/LaunchAgents, /Library/LaunchAgents ou /Library/LaunchDaemons, ou les enregistrent depuis leur propre bundle.

Les clés qui font revenir une app

Voici un agent de lancement typique :

<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/>
CléEffetCe que vous voyez
RunAtLoadDémarre la tâche dès son chargement, c'est-à-dire à chaque connexion (agents) ou au démarrage (daemons)Elle est là après chaque redémarrage
KeepAlive = trueRelance le processus chaque fois qu'il se termineForcer à quitter ne sert à rien ; elle revient en quelques secondes
KeepAlive avec conditionsRelance seulement dans certains cas, par exemple après un plantage (SuccessfulExit = false) ou tant que le réseau est disponibleElle revient parfois, pas toujours
StartIntervalS'exécute toutes les N secondesElle apparaît, tourne brièvement, disparaît, et recommence
StartCalendarIntervalS'exécute à des heures fixes, comme cronElle apparaît chaque jour à la même heure
WatchPathsS'exécute quand un fichier ou un dossier changeElle apparaît après une action sans rapport apparent

launchd attend environ 10 secondes entre deux relances d'une tâche qui ne cesse de se terminer : une tâche KeepAlive peut donc aussi sembler « clignoter ».

Autres raisons pour lesquelles une app revient

Trouver laquelle est en cause

  1. Trouvez le label de la tâche. Exécutez launchctl list | grep -i example, avec une partie du nom de l'app ou du développeur. La troisième colonne est le label.
  2. Lisez la tâche :
    launchctl print gui/$(id -u)/com.example.helper
    Repérez path (le fichier plist), state, runs (le nombre de démarrages) et last exit code. Un nombre de démarrages élevé signale généralement KeepAlive.
  3. Ouvrez le plist et vérifiez RunAtLoad, KeepAlive et les clés d'intervalle.
  4. S'il n'y a pas de tâche, vérifiez Ouvrir à la connexion et les réglages de l'app elle-même.

Arrêter ou désactiver

Ce que vous faitesElle revient ?
Quitter ou forcer à quitter le processusOui : tout de suite avec KeepAlive, à la prochaine connexion avec RunAtLoad
launchctl bootout gui/$(id -u)/labelPas tout de suite. Oui à la prochaine connexion avec RunAtLoad
launchctl disable gui/$(id -u)/label + bootoutNon, jusqu'à ce que vous exécutiez launchctl enable
Sortir le plist de LaunchAgents + bootoutNon, jusqu'à ce que vous le remettiez en place
Désactiver dans Autoriser en arrière-planNon, jusqu'à ce que vous le réactiviez

Les commandes pas à pas se trouvent dans comment désactiver les agents de lancement sans risque.

FAQ

Pourquoi un processus redémarre-t-il juste après que je l'ai quitté dans le Moniteur d'activité ?

Sa tâche launchd a KeepAlive activé. launchd surveille le processus et le relance quand il se termine. Arrêtez la tâche avec launchctl bootout au lieu de quitter le processus.

Que signifie RunAtLoad ?

RunAtLoad est une clé d'un plist launchd. Quand elle vaut true, launchd démarre la tâche dès qu'il charge le plist, ce qui, pour un agent de lancement, signifie à chaque connexion.

Que signifie KeepAlive ?

KeepAlive demande à launchd de maintenir la tâche en marche. Si le processus se termine ou est tué, launchd le relance. Ce peut aussi être un ensemble de conditions, par exemple ne relancer qu'après un plantage.

Quelle différence entre arrêter et désactiver un agent de lancement ?

Arrêter (launchctl bootout) décharge la tâche jusqu'à la prochaine connexion ou au prochain redémarrage. Désactiver (launchctl disable, ou sortir le plist de LaunchAgents) l'empêche de se recharger après un redémarrage.