←→ Underneath: Background Apps · Toate ghidurile pentru Mac

De ce revine o aplicație după ce repornești Mac-ul

Ai închis-o. Ai forțat chiar ieșirea din ea în Monitor activitate. După două secunde sau după următoarea repornire, rulează din nou. Ceva o pornește intenționat. Pe un Mac, acel ceva este aproape întotdeauna launchd.

Pe scurt: aplicația are o sarcină launchd. RunAtLoad o pornește la fiecare autentificare, iar KeepAlive o pornește din nou ori de câte ori se oprește. Închiderea procesului nu schimbă sarcina. Ca s-o oprești definitiv, dezactivează sarcina, nu procesul.

Ce este launchd

launchd este primul proces pe care îl pornește macOS (ID de proces 1). El pornește aproape tot restul. Citește mici fișiere .plist, numite sarcini (jobs), care spun ce să ruleze și când. Fiecare sarcină are o etichetă, un nume unic precum com.google.keystone.agent.

Aplicațiile instalează sarcini în ~/Library/LaunchAgents, /Library/LaunchAgents sau /Library/LaunchDaemons ori le înregistrează din interiorul propriului pachet.

Cheile care readuc o aplicație

Iată un agent de lansare tipic:

<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/>
CheieEfectCe vezi
RunAtLoadPornește sarcina imediat ce se încarcă, adică la fiecare autentificare (agenți) sau pornire (daemoni)E acolo după fiecare repornire
KeepAlive = trueRepornește procesul ori de câte ori se terminăForțarea ieșirii nu ajută; revine în câteva secunde
KeepAlive cu condițiiRepornește doar în unele cazuri, de exemplu după o blocare (SuccessfulExit = false) sau cât timp rețeaua este activăRevine uneori, nu întotdeauna
StartIntervalRulează la fiecare N secundeApare, rulează scurt, dispare, se repetă
StartCalendarIntervalRulează la ore stabilite, ca cronApare în fiecare zi la aceeași oră
WatchPathsRulează când se modifică un fișier sau un dosarApare după ce faci ceva aparent fără legătură

launchd așteaptă circa 10 secunde între repornirile unei sarcini care tot se termină, așa că o sarcină cu KeepAlive poate părea și că „pâlpâie”.

Alte motive pentru care revine o aplicație

Află care este cauza

  1. Găsește eticheta sarcinii. Rulează launchctl list | grep -i example, folosind o parte din numele aplicației sau al dezvoltatorului. A treia coloană este eticheta.
  2. Citește sarcina:
    launchctl print gui/$(id -u)/com.example.helper
    Caută path (fișierul plist), state, runs (de câte ori a pornit) și last exit code. Un număr mare de porniri înseamnă de obicei KeepAlive.
  3. Deschide fișierul plist și verifică RunAtLoad, KeepAlive și cheile de interval.
  4. Dacă nu există nicio sarcină, verifică Deschide la autentificare și configurările proprii ale aplicației.

Oprire vs. dezactivare

Ce faciRevine?
Închizi procesul sau forțezi ieșireaDa: imediat dacă are KeepAlive, la următoarea autentificare dacă are RunAtLoad
launchctl bootout gui/$(id -u)/labelNu acum. Da la următoarea autentificare dacă are RunAtLoad
launchctl disable gui/$(id -u)/label + bootoutNu, până rulezi launchctl enable
Muți fișierul plist în afara LaunchAgents + bootoutNu, până îl muți înapoi
Dezactivezi în Permite în fundalNu, până îl activezi din nou

Comenzile pas cu pas sunt în cum dezactivezi în siguranță agenții de lansare.

FAQ

De ce repornește un proces imediat după ce îl închid în Monitor activitate?

Sarcina sa launchd are setat KeepAlive. launchd supraveghează procesul și îl pornește din nou când acesta se termină. Oprește sarcina cu launchctl bootout în loc să închizi procesul.

Ce înseamnă RunAtLoad?

RunAtLoad este o cheie dintr-un fișier plist launchd. Când este true, launchd pornește sarcina imediat ce încarcă fișierul plist, ceea ce pentru un agent de lansare înseamnă la fiecare autentificare.

Ce înseamnă KeepAlive?

KeepAlive îi spune lui launchd să mențină sarcina în rulare. Dacă procesul se termină sau este omorât, launchd îl pornește din nou. Poate fi și un set de condiții, de exemplu repornire doar după o blocare.

Care este diferența dintre oprirea și dezactivarea unui agent de lansare?

Oprirea (launchctl bootout) descarcă sarcina până la următoarea autentificare sau repornire. Dezactivarea (launchctl disable sau mutarea fișierului plist în afara LaunchAgents) o împiedică să se încarce din nou după repornire.