←→ 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/>
KulcsHatásAmit látsz
RunAtLoadBetö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 = trueMinden kilépés után újraindítja a folyamatotA kényszerített kilépés nem segít; másodperceken belül visszatér
KeepAlive feltételekkelCsak bizonyos esetekben indítja újra, például összeomlás után (SuccessfulExit = false) vagy amíg van hálózatNéha visszatér, de nem mindig
StartIntervalN másodpercenként futMegjelenik, röviden fut, eltűnik, és ez ismétlődik
StartCalendarIntervalMeghatározott időpontokban fut, mint a cronMinden nap ugyanabban az időben jelenik meg
WatchPathsAkkor fut, ha egy fájl vagy mappa megváltozikLá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

Derítsd ki, melyik az

  1. Keresd meg a feladat címkéjét. Futtasd a launchctl list | grep -i example parancsot az app vagy a fejlesztő nevének egy részével. A harmadik oszlop a címke.
  2. Olvasd ki a feladatot:
    launchctl print gui/$(id -u)/com.example.helper
    Keresd a path (a plist fájl), a state, a runs (hányszor indult el) és a last exit code sort. A magas runs érték általában KeepAlive beállításra utal.
  3. Nyisd meg a plistet, és ellenőrizd a RunAtLoad, a KeepAlive és az intervallumkulcsokat.
  4. 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 teszelVisszatér?
Kilépés vagy kényszerített kilépés a folyamatbólIgen: KeepAlive esetén azonnal, RunAtLoad esetén a következő bejelentkezéskor
launchctl bootout gui/$(id -u)/labelMost nem. RunAtLoad esetén a következő bejelentkezéskor igen
launchctl disable gui/$(id -u)/label + bootoutNem, amíg nem futtatod a launchctl enable parancsot
A plist kimozgatása a LaunchAgents mappából + bootoutNem, amíg vissza nem teszed
Kikapcsolás az Engedélyezés a háttérben listábanNem, 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.