Úloha sa spustí pri prihlásení, log ukazuje štart klienta, ale tunel nikdy nenabehne. Alebo nabehne a o pár sekúnd zmizne. V oboch prípadoch bol zoznam vlastností pravdepodobne v poriadku. launchd dal pri prijatí úlohy dva prísľuby: bude dohliadať na proces a ten proces bude ďalej bežať. VPN potrebuje oboje a správny XML súbor neposkytuje ani jedno.

Platný zoznam vlastností ešte nie je fungujúca služba

plutil -lint kontroluje štruktúru. Nepovie vám, či binárny súbor existuje, či túto verziu klienta podporuje argumenty alebo či sa úloha spúšťa v kontexte, kde sú prihlasovacie údaje dostupné. To sú sémantické otázky a vysvetľujú väčšinu zlyhaní, ktoré vyzerajú ako problémy s launchd.

plutil -lint /Library/LaunchDaemons/com.example.vpn.plist
launchctl print system/com.example.vpn

Prečítajte si výstup druhého príkazu namiesto predpokladu, že úloha je načítaná. Uvádza posledný stav ukončenia a či služba beží, čo pred zásahom do profilu odlíši „nikdy sa nespustila“ od „spustila sa a zomrela“.

Agenti dedia používateľskú reláciu, démoni nie

Dokumentácia Apple k launchd oddeľuje agentov jednotlivých používateľov od systémových démonov. Agent beží v kontexte prihláseného používateľa, s jeho zväzkom kľúčov a prostredím. Démon beží bez tejto relácie a presun úlohy do systémového adresára znova nevytvorí interaktívne prihlasovacie údaje používateľa.

Práve tento rozdiel určuje návrh. Ak pripojenie vyžaduje, aby sa človek prihlásil alebo schválil výzvu MFA, podporovaným usporiadaním je úloha v používateľskej relácii, ktorá sa spustí po prihlásení. Ak musí fungovať bez nikoho prihláseného, klient potrebuje schválenú neobsluhovanú identitu s vlastným procesom obnovy a odvolania. Výber nesprávneho riadku vytvorí úlohu, ktorá sa čisto spustí a zlyhá na prvom kroku autentifikácie.

Nezakrývajte rozdiel heslom v poli argumentov ani vypnutím kontrol certifikátov. Oboje mení požiadavku na autentifikáciu na trvalé tajomstvo v čitateľnom súbore a to druhé znamená, že tunel autentifikuje všetko, čo odpovie.

Dohľad funguje len vtedy, keď proces zostane v popredí

Klient, ktorý sa sám démonizuje, okamžite vráti riadenie launchd a dohliadateľ potom sleduje proces, ktorý už skončil. Tunel môže byť hore, ale launchd si myslí, že úloha zlyhala, a jeho politika reštartu urobí niečo, čo ste nezamýšľali.

Použite dokumentovaný režim popredia alebo služby. Ak má produkt vlastnú podporovanú funkciu štartu, tá už vie, ako zostať v popredí a ako odovzdať riadenie sieťovému zásobníku; vlastná úloha je samostatný návrh, nie jeho vylepšenie.

Dajte úlohe jedinečný štítok, zamýšľaný spustiteľný súbor a premyslené pole argumentov. Pole nie je príkazový riadok shellu, takže rúry a presmerovania tam nefungujú a úvodzovky sa správajú inak. Príkaz, ktorý uspeje v termináli správcu, je nanajvýš predbežná kontrola.

Prihlasovacie údaje musia fungovať bez výzvy

Neobsluhovaná prevádzka problém s prihlasovacími údajmi presúva, namiesto toho aby ho odstránila. Niekto musí identitu vlastniť, rozhodnúť, ako dlho žije, a zdokumentovať, ako sa nahrádza. Certifikát bez sledovania platnosti sa stane výpadkom s dátumom v kalendári.

Tajomstvá držte mimo argumentov a mimo štandardného výstupu úlohy. Ak klient podporuje čítanie prihlasovacích údajov z chráneného úložiska, použite tú cestu a overte, či sa kontext spustenia úlohy dostane k úložisku. Démon bežiaci ako root zvyčajne nemôže prečítať položku prihlasovacej kľúčenky, a to je druh detailu, ktorý sa objaví len v systémovom kontexte.

Definujte, čo znamená pripravené, a testujte tam

Úspešný štart dokazuje, že proces začal. Nedokazuje, že sieť je hore, že brána prijala identitu alebo že súkromná aplikácia je dostupná. Ak na tuneli závisí niečo iné, potrebuje signál pripravenosti, ktorý odráža spojenie, nie čas štartu úlohy.

Opakovania majú byť obmedzené a majú rozlíšiť chýbajúcu sieť od odmietnutých prihlasovacích údajov. Reštart pri každej chybe neopraví vypršaný certifikát a vytvorí log plný rovnakých pokusov, ktorý skryje ten skutočný.

Prijmite úlohu v kontexte, v ktorom bude naozaj bežať: bez siete pri štarte, pri normálnom prihlásení, po prebudení zo spánku a pri riadenom zastavení. Potom zapíšte štítok úlohy, verziu klienta a revíziu profilu spolu, aby ďalší človek zdedil priraditeľnú službu a nie súbor, ktorý kedysi fungoval.

Súvisiace články