←→ 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é | Effet | Ce que vous voyez |
|---|---|---|
RunAtLoad | Dé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 = true | Relance le processus chaque fois qu'il se termine | Forcer à quitter ne sert à rien ; elle revient en quelques secondes |
KeepAlive avec conditions | Relance seulement dans certains cas, par exemple après un plantage (SuccessfulExit = false) ou tant que le réseau est disponible | Elle revient parfois, pas toujours |
StartInterval | S'exécute toutes les N secondes | Elle apparaît, tourne brièvement, disparaît, et recommence |
StartCalendarInterval | S'exécute à des heures fixes, comme cron | Elle apparaît chaque jour à la même heure |
WatchPaths | S'exécute quand un fichier ou un dossier change | Elle 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
- Ouvrir à la connexion. L'app figure dans Réglages Système › Général › Ouverture et extensions. macOS l'ouvre à chaque connexion.
- Rouvrir les fenêtres lors de la prochaine ouverture de session. Cette case de la fenêtre Redémarrer et Éteindre restaure toutes les apps qui étaient ouvertes.
- L'app se rajoute elle-même. Son propre réglage « Lancer à la connexion » la réenregistre à chaque lancement.
- Un processus auxiliaire ouvre l'app principale. Un petit processus auxiliaire en arrière-plan démarre d'abord, puis ouvre l'app complète, par exemple pour afficher un état de synchronisation.
- Les services Homebrew.
brew services startécrit un agent de lancement avecRunAtLoad. Arrêtez-le avecbrew services stop <name>.
Trouver laquelle est en cause
- 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. - Lisez la tâche :
Repérezlaunchctl print gui/$(id -u)/com.example.helperpath(le fichier plist),state,runs(le nombre de démarrages) etlast exit code. Un nombre de démarrages élevé signale généralementKeepAlive. - Ouvrez le plist et vérifiez
RunAtLoad,KeepAliveet les clés d'intervalle. - 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 faites | Elle revient ? |
|---|---|
| Quitter ou forcer à quitter le processus | Oui : tout de suite avec KeepAlive, à la prochaine connexion avec RunAtLoad |
launchctl bootout gui/$(id -u)/label | Pas tout de suite. Oui à la prochaine connexion avec RunAtLoad |
launchctl disable gui/$(id -u)/label + bootout | Non, jusqu'à ce que vous exécutiez launchctl enable |
| Sortir le plist de LaunchAgents + bootout | Non, jusqu'à ce que vous le remettiez en place |
| Désactiver dans Autoriser en arrière-plan | Non, 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.