←→ Underneath: Background Apps · Összes Mac-útmutató
Miért tér vissza egy app, miután újraindítod a Macet?
Kiléptél belőle. Sőt, a Tevékenységfigyelőben kényszerítetted a kilépést. Két másodperc múlva, vagy a következő újraindítás után, megint fut. Valami szándékosan elindítja. Macen ez a valami szinte mindig a launchd.
Röviden: az appnak van egy launchd-feladata. A RunAtLoad minden bejelentkezéskor elindítja, a KeepAlive pedig minden leállás után újraindítja. A folyamatból való kilépés nem változtat a feladaton. Ha végleg le akarod állítani, a feladatot tiltsd le, ne a folyamatot.
Mi a launchd
A launchd az első folyamat, amelyet a macOS elindít (folyamatazonosító: 1). Szinte minden mást ez indít el. Kis .plist fájlokat olvas, ezeket feladatoknak (jobs) nevezik, és megmondják, mit és mikor kell futtatni. Minden feladatnak van egy címkéje (label), egy egyedi neve, például com.google.keystone.agent.
Az appok a ~/Library/LaunchAgents, a /Library/LaunchAgents vagy a /Library/LaunchDaemons mappába telepítik a feladataikat, vagy a saját appcsomagjukon belülről regisztrálják őket.
A kulcsok, amelyek visszahoznak egy appot
Íme egy tipikus launch agent:
<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/>
| Kulcs | Hatás | Amit látsz |
|---|---|---|
RunAtLoad | Betöltéskor azonnal elindítja a feladatot, azaz minden bejelentkezéskor (agentek) vagy rendszerindításkor (daemonok) | Minden újraindítás után ott van |
KeepAlive = true | Minden kilépés után újraindítja a folyamatot | A kényszerített kilépés nem segít; másodperceken belül visszatér |
KeepAlive feltételekkel | Csak bizonyos esetekben indítja újra, például összeomlás után (SuccessfulExit = false) vagy amíg van hálózat | Néha visszatér, de nem mindig |
StartInterval | N másodpercenként fut | Megjelenik, röviden fut, eltűnik, és ez ismétlődik |
StartCalendarInterval | Meghatározott időpontokban fut, mint a cron | Minden nap ugyanabban az időben jelenik meg |
WatchPaths | Akkor fut, ha egy fájl vagy mappa megváltozik | Látszólag független műveletek után jelenik meg |
A launchd körülbelül 10 másodpercet vár egy folyton kilépő feladat újraindításai között, ezért egy KeepAlive feladat „villogónak” is tűnhet.
Más okok, amiért egy app visszatér
- Megnyitás bejelentkezéskor. Az app szerepel a Rendszerbeállítások › Általános › Bejelentkezési elemek és bővítmények oldalon. A macOS minden bejelentkezéskor megnyitja.
- Ablakok újranyitása visszajelentkezéskor. Az Újraindítás és Leállítás párbeszédablak jelölőnégyzete minden korábban nyitott appot visszaállít.
- Az app újra felveszi magát. A saját „Indítás bejelentkezéskor” beállítása minden futáskor újra regisztrálja.
- Egy segédfolyamat megnyitja a fő appot. Egy kis háttér-segédfolyamat indul el először, majd megnyitja a teljes appot, például a szinkronizálási állapot megjelenítéséhez.
- Homebrew-szolgáltatások. A
brew services startegyRunAtLoadkulccsal rendelkező launch agentet ír. Állítsd le abrew services stop <name>paranccsal.
Derítsd ki, melyik az
- Keresd meg a feladat címkéjét. Futtasd a
launchctl list | grep -i exampleparancsot az app vagy a fejlesztő nevének egy részével. A harmadik oszlop a címke. - Olvasd ki a feladatot:
Keresd alaunchctl print gui/$(id -u)/com.example.helperpath(a plist fájl), astate, aruns(hányszor indult el) és alast exit codesort. A magas runs érték általábanKeepAlivebeállításra utal. - Nyisd meg a plistet, és ellenőrizd a
RunAtLoad, aKeepAliveés az intervallumkulcsokat. - Ha nincs feladat, ellenőrizd a Megnyitás bejelentkezéskor listát és az app saját beállításait.
Leállítás vagy letiltás
| Amit teszel | Visszatér? |
|---|---|
| Kilépés vagy kényszerített kilépés a folyamatból | Igen: KeepAlive esetén azonnal, RunAtLoad esetén a következő bejelentkezéskor |
launchctl bootout gui/$(id -u)/label | Most nem. RunAtLoad esetén a következő bejelentkezéskor igen |
launchctl disable gui/$(id -u)/label + bootout | Nem, amíg nem futtatod a launchctl enable parancsot |
| A plist kimozgatása a LaunchAgents mappából + bootout | Nem, amíg vissza nem teszed |
| Kikapcsolás az Engedélyezés a háttérben listában | Nem, amíg vissza nem kapcsolod |
A parancsok lépésről lépésre a launch agentek biztonságos letiltásáról szóló útmutatóban találhatók.
GYIK
Miért indul újra egy folyamat rögtön azután, hogy kiléptem belőle a Tevékenységfigyelőben?
A launchd-feladatánál be van állítva a KeepAlive. A launchd figyeli a folyamatot, és újraindítja, amikor kilép. A folyamatból való kilépés helyett állítsd le a feladatot a launchctl bootout paranccsal.
Mit jelent a RunAtLoad?
A RunAtLoad egy kulcs a launchd plistben. Ha értéke true, a launchd rögtön elindítja a feladatot, amint betölti a plistet, ami egy launch agent esetén minden bejelentkezést jelent.
Mit jelent a KeepAlive?
A KeepAlive arra utasítja a launchd-t, hogy tartsa futásban a feladatot. Ha a folyamat kilép vagy leállítják, a launchd újraindítja. Feltételek csoportja is lehet, például hogy csak összeomlás után induljon újra.
Mi a különbség egy launch agent leállítása és letiltása között?
A leállítás (launchctl bootout) a következő bejelentkezésig vagy újraindításig eltávolítja a feladatot. A letiltás (launchctl disable, vagy a plist kimozgatása a LaunchAgents mappából) megakadályozza, hogy újraindítás után újra betöltődjön.