←→ 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/>
SleutelEffectWat je ziet
RunAtLoadStart de taak zodra hij geladen wordt, dus bij elke inlog (agents) of opstart (daemons)Hij is er na elke herstart
KeepAlive = trueHerstart het proces telkens als het stoptGeforceerd stoppen helpt niet; binnen enkele seconden is hij terug
KeepAlive met voorwaardenHerstart alleen in bepaalde gevallen, zoals na een crash (SuccessfulExit = false) of zolang het netwerk actief isHij komt soms terug, niet altijd
StartIntervalDraait elke N secondenHij verschijnt, draait even, verdwijnt, en dat herhaalt zich
StartCalendarIntervalDraait op vaste tijden, zoals cronHij verschijnt elke dag op hetzelfde tijdstip
WatchPathsDraait als een bestand of map verandertHij 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

Zoek uit welke het is

  1. Zoek het label van de taak. Voer launchctl list | grep -i example uit, met een deel van de naam van de app of ontwikkelaar. De derde kolom is het label.
  2. Lees de taak:
    launchctl print gui/$(id -u)/com.example.helper
    Let op path (het plist-bestand), state, runs (hoe vaak hij is gestart) en last exit code. Een hoog aantal runs wijst meestal op KeepAlive.
  3. Open de plist en controleer RunAtLoad, KeepAlive en de intervalsleutels.
  4. Is er geen taak, controleer dan Open bij inloggen en de eigen instellingen van de app.

Beëindigen of uitschakelen

Wat je doetKomt het terug?
Het proces stoppen of geforceerd stoppenJa: meteen bij KeepAlive, bij de volgende inlog bij RunAtLoad
launchctl bootout gui/$(id -u)/labelNu niet. Wel bij de volgende inlog bij RunAtLoad
launchctl disable gui/$(id -u)/label + bootoutNee, tot je launchctl enable uitvoert
De plist uit LaunchAgents verplaatsen + bootoutNee, tot je hem terugzet
Uitzetten in Sta toe op achtergrondNee, 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.