←→ 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/>
| Cheie | Efect | Ce vezi |
|---|---|---|
RunAtLoad | Pornește sarcina imediat ce se încarcă, adică la fiecare autentificare (agenți) sau pornire (daemoni) | E acolo după fiecare repornire |
KeepAlive = true | Repornește procesul ori de câte ori se termină | Forțarea ieșirii nu ajută; revine în câteva secunde |
KeepAlive cu condiții | Repornește doar în unele cazuri, de exemplu după o blocare (SuccessfulExit = false) sau cât timp rețeaua este activă | Revine uneori, nu întotdeauna |
StartInterval | Rulează la fiecare N secunde | Apare, rulează scurt, dispare, se repetă |
StartCalendarInterval | Rulează la ore stabilite, ca cron | Apare în fiecare zi la aceeași oră |
WatchPaths | Rulează când se modifică un fișier sau un dosar | Apare 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
- Deschide la autentificare. Aplicația este în Configurări sistem › General › Articole de autentificare și extensii. macOS o deschide la fiecare autentificare.
- Redeschide ferestrele la reautentificare. Caseta din dialogul de repornire și oprire restaurează fiecare aplicație care era deschisă.
- Aplicația se adaugă din nou singură. Configurarea ei proprie „Lansează la autentificare” o reînregistrează de fiecare dată când rulează.
- Un proces ajutător deschide aplicația principală. Un mic proces ajutător din fundal pornește primul și apoi deschide aplicația completă, de exemplu ca să arate starea sincronizării.
- Servicii Homebrew.
brew services startscrie un agent de lansare cuRunAtLoad. Oprește-l cubrew services stop <name>.
Află care este cauza
- 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. - Citește sarcina:
Cautălaunchctl print gui/$(id -u)/com.example.helperpath(fișierul plist),state,runs(de câte ori a pornit) șilast exit code. Un număr mare de porniri înseamnă de obiceiKeepAlive. - Deschide fișierul plist și verifică
RunAtLoad,KeepAliveși cheile de interval. - Dacă nu există nicio sarcină, verifică Deschide la autentificare și configurările proprii ale aplicației.
Oprire vs. dezactivare
| Ce faci | Revine? |
|---|---|
| Închizi procesul sau forțezi ieșirea | Da: imediat dacă are KeepAlive, la următoarea autentificare dacă are RunAtLoad |
launchctl bootout gui/$(id -u)/label | Nu acum. Da la următoarea autentificare dacă are RunAtLoad |
launchctl disable gui/$(id -u)/label + bootout | Nu, până rulezi launchctl enable |
| Muți fișierul plist în afara LaunchAgents + bootout | Nu, până îl muți înapoi |
| Dezactivezi în Permite în fundal | Nu, 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.