←→ Underneath: Background Apps · Alle Mac-handleidingen
Waarom een app terugkomt nadat je je Mac herstart
Je hebt hem gestopt. Je hebt hem zelfs geforceerd gestopt in Activiteitenweergave. Twee seconden later, of na de volgende herstart, draait hij weer. Iets start hem expres. Op een Mac is dat iets bijna altijd launchd.
Kort antwoord: de app heeft een launchd-taak. RunAtLoad start hem bij elke inlog, en KeepAlive start hem opnieuw zodra hij stopt. Het proces stoppen verandert niets aan de taak. Wil je hem voorgoed stoppen, schakel dan de taak uit, niet het proces.
Wat launchd is
launchd is het eerste proces dat macOS start (proces-ID 1). Het start bijna al het andere. Het leest kleine .plist-bestanden, taken (jobs) genoemd, die zeggen wat er wanneer moet draaien. Elke taak heeft een label, een unieke naam zoals com.google.keystone.agent.
Apps installeren taken in ~/Library/LaunchAgents, /Library/LaunchAgents of /Library/LaunchDaemons, of registreren ze vanuit hun eigen app-bundel.
De sleutels die een app terugbrengen
Zo ziet een typische launch agent eruit:
<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/>
| Sleutel | Effect | Wat je ziet |
|---|---|---|
RunAtLoad | Start de taak zodra hij geladen wordt, dus bij elke inlog (agents) of opstart (daemons) | Hij is er na elke herstart |
KeepAlive = true | Herstart het proces telkens als het stopt | Geforceerd stoppen helpt niet; binnen enkele seconden is hij terug |
KeepAlive met voorwaarden | Herstart alleen in bepaalde gevallen, zoals na een crash (SuccessfulExit = false) of zolang het netwerk actief is | Hij komt soms terug, niet altijd |
StartInterval | Draait elke N seconden | Hij verschijnt, draait even, verdwijnt, en dat herhaalt zich |
StartCalendarInterval | Draait op vaste tijden, zoals cron | Hij verschijnt elke dag op hetzelfde tijdstip |
WatchPaths | Draait als een bestand of map verandert | Hij verschijnt nadat je iets schijnbaar ongerelateerds doet |
launchd wacht ongeveer 10 seconden tussen herstarts van een taak die steeds stopt, dus een KeepAlive-taak kan ook lijken te ‘knipperen’.
Andere redenen waarom een app terugkomt
- Open bij inloggen. De app staat in Systeeminstellingen › Algemeen › Inlogonderdelen en extensies. macOS opent hem bij elke inlog.
- Open vensters opnieuw bij volgende keer inloggen. Het vakje in het venster voor herstarten en uitzetten herstelt elke app die open was.
- De app voegt zichzelf weer toe. Zijn eigen instelling ‘Start bij inloggen’ registreert hem opnieuw elke keer dat hij draait.
- Een hulpproces opent de hoofdapp. Een klein hulpproces op de achtergrond start eerst en opent daarna de volledige app, bijvoorbeeld om een synchronisatiestatus te tonen.
- Homebrew-services.
brew services startschrijft een launch agent metRunAtLoad. Beëindig hem metbrew services stop <name>.
Zoek uit welke het is
- Zoek het label van de taak. Voer
launchctl list | grep -i exampleuit, met een deel van de naam van de app of ontwikkelaar. De derde kolom is het label. - Lees de taak:
Let oplaunchctl print gui/$(id -u)/com.example.helperpath(het plist-bestand),state,runs(hoe vaak hij is gestart) enlast exit code. Een hoog aantal runs wijst meestal opKeepAlive. - Open de plist en controleer
RunAtLoad,KeepAliveen de intervalsleutels. - Is er geen taak, controleer dan Open bij inloggen en de eigen instellingen van de app.
Beëindigen of uitschakelen
| Wat je doet | Komt het terug? |
|---|---|
| Het proces stoppen of geforceerd stoppen | Ja: meteen bij KeepAlive, bij de volgende inlog bij RunAtLoad |
launchctl bootout gui/$(id -u)/label | Nu niet. Wel bij de volgende inlog bij RunAtLoad |
launchctl disable gui/$(id -u)/label + bootout | Nee, tot je launchctl enable uitvoert |
| De plist uit LaunchAgents verplaatsen + bootout | Nee, tot je hem terugzet |
| Uitzetten in Sta toe op achtergrond | Nee, tot je hem weer aanzet |
De opdrachten stap voor stap staan in zo schakel je launch agents veilig uit.
FAQ
Waarom start een proces meteen opnieuw nadat ik het in Activiteitenweergave heb gestopt?
De launchd-taak heeft KeepAlive ingesteld. launchd houdt het proces in de gaten en start het opnieuw als het stopt. Beëindig de taak met launchctl bootout in plaats van het proces te stoppen.
Wat betekent RunAtLoad?
RunAtLoad is een sleutel in een launchd-plist. Als die true is, start launchd de taak zodra het de plist laadt, wat bij een launch agent betekent: elke keer dat je inlogt.
Wat betekent KeepAlive?
KeepAlive vertelt launchd de taak actief te houden. Als het proces stopt of wordt afgebroken, start launchd het opnieuw. Het kan ook een set voorwaarden zijn, zoals alleen herstarten na een crash.
Wat is het verschil tussen een launch agent beëindigen en uitschakelen?
Beëindigen (launchctl bootout) laadt de taak uit tot de volgende inlog of herstart. Uitschakelen (launchctl disable, of de plist uit LaunchAgents verplaatsen) voorkomt dat hij na een herstart opnieuw wordt geladen.