Η εργασία εκτελείται κατά τη σύνδεση, το αρχείο καταγραφής δείχνει τον πελάτη να ξεκινά και η σήραγγα δεν ανεβαίνει ποτέ. Ή ανεβαίνει και εξαφανίζεται λίγα δευτερόλεπτα αργότερα. Και στις δύο περιπτώσεις η λίστα ιδιοτήτων ήταν πιθανώς εντάξει. Το launchd έδωσε δύο υποσχέσεις όταν δέχτηκε την εργασία: θα επιβλέπει μια διεργασία και αυτή η διεργασία θα συνεχίσει να εκτελείται. Το VPN χρειάζεται και τα δύο, και ένα σωστό αρχείο XML δεν παρέχει κανένα.

Μια έγκυρη λίστα ιδιοτήτων δεν είναι λειτουργική υπηρεσία

Το plutil -lint ελέγχει τη δομή. Δεν μπορεί να σας πει αν υπάρχει το δυαδικό αρχείο, αν τα ορίσματα υποστηρίζονται από αυτή την έκδοση πελάτη ή αν η εργασία ξεκινά σε πλαίσιο όπου τα διαπιστευτήρια είναι διαθέσιμα. Αυτά είναι σημασιολογικά ερωτήματα και εξηγούν τις περισσότερες αποτυχίες που μοιάζουν με προβλήματα του launchd.

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

Διαβάστε την έξοδο της δεύτερης εντολής αντί να υποθέσετε ότι η εργασία φορτώθηκε. Αναφέρει την τελευταία κατάσταση εξόδου και αν η υπηρεσία εκτελείται, κάτι που διακρίνει το “δεν ξεκίνησε ποτέ” από το “ξεκίνησε και πέθανε” πριν αγγίξετε το προφίλ.

Οι πράκτορες κληρονομούν συνεδρία χρήστη, οι δαίμονες όχι

Η τεκμηρίωση του launchd της Apple διαχωρίζει τους πράκτορες ανά χρήστη από τους δαίμονες συστήματος. Ένας πράκτορας εκτελείται στο πλαίσιο του συνδεδεμένου χρήστη, με την κλειδοθήκη και το περιβάλλον του. Ένας δαίμονας εκτελείται χωρίς αυτή τη συνεδρία, και η μεταφορά μιας εργασίας σε κατάλογο συστήματος δεν αναδημιουργεί τα διαδραστικά διαπιστευτήρια του χρήστη.

Αυτή η διάκριση καθορίζει τον σχεδιασμό. Αν η σύνδεση απαιτεί από κάποιον να συνδεθεί ή να εγκρίνει ένα αίτημα MFA, η υποστηριζόμενη διάταξη είναι εργασία στη συνεδρία χρήστη που εκτελείται μετά τη σύνδεση. Αν πρέπει να λειτουργεί χωρίς κανέναν συνδεδεμένο, ο πελάτης χρειάζεται εγκεκριμένη ταυτότητα χωρίς επίβλεψη με δική της διαδικασία ανανέωσης και ανάκλησης. Η επιλογή της λάθος γραμμής παράγει μια εργασία που ξεκινά καθαρά και αποτυγχάνει στο πρώτο βήμα ελέγχου ταυτότητας.

Μην καλύψετε τη διαφορά με κωδικό πρόσβασης στον πίνακα ορισμάτων ή απενεργοποιώντας τους ελέγχους πιστοποιητικών. Και τα δύο μετατρέπουν μια απαίτηση ελέγχου ταυτότητας σε μόνιμο μυστικό σε αναγνώσιμο αρχείο, και το δεύτερο σημαίνει ότι η σήραγγα επικυρώνει οτιδήποτε απαντά.

Η επίβλεψη λειτουργεί μόνο αν η διεργασία μείνει μπροστά

Ένας πελάτης που μετατρέπει τον εαυτό του σε δαίμονα επιστρέφει τον έλεγχο στο launchd αμέσως, και ο επόπτης παρακολουθεί τότε μια διεργασία που έχει ήδη τερματιστεί. Η σήραγγα μπορεί να είναι ενεργή, αλλά το launchd πιστεύει ότι η εργασία απέτυχε, και η πολιτική επανεκκίνησής του θα κάνει κάτι που δεν σκοπεύατε.

Χρησιμοποιήστε την τεκμηριωμένη λειτουργία προσκηνίου ή υπηρεσίας του πελάτη. Αν το προϊόν έχει δική του υποστηριζόμενη λειτουργία εκκίνησης, ξέρει ήδη πώς να μένει στο προσκήνιο και πώς να παραδίδει στη στοίβα δικτύου· μια προσαρμοσμένη εργασία είναι ξεχωριστός σχεδιασμός, όχι βελτίωσή του.

Δώστε στην εργασία μοναδική ετικέτα, το επιδιωκόμενο εκτελέσιμο και ένα σκόπιμο πλέγμα ορισμάτων. Το πλέγμα δεν είναι γραμμή εντολών shell, οπότε οι σωλήνες και οι ανακατευθύνσεις δεν λειτουργούν εκεί, και τα εισαγωγικά συμπεριφέρονται διαφορετικά. Μια εντολή που πετυχαίνει στο τερματικό ενός διαχειριστή είναι στην καλύτερη περίπτωση προκαταρκτικός έλεγχος.

Τα διαπιστευτήρια πρέπει να λειτουργούν χωρίς προτροπή

Η λειτουργία χωρίς επίβλεψη μετακινεί το πρόβλημα των διαπιστευτηρίων αντί να το αφαιρεί. Κάποιος πρέπει να κατέχει την ταυτότητα, να αποφασίσει πόσο ζει και να τεκμηριώσει πώς αντικαθίσταται. Ένα πιστοποιητικό χωρίς παρακολούθηση λήξης γίνεται διακοπή με ημερομηνία στο ημερολόγιο.

Κρατήστε τα μυστικά έξω από τα ορίσματα και έξω από την τυπική έξοδο της εργασίας. Αν ο πελάτης υποστηρίζει ανάγνωση διαπιστευτηρίου από προστατευμένη αποθήκη, χρησιμοποιήστε αυτή τη διαδρομή και ελέγξτε ότι το πλαίσιο εκτέλεσης της εργασίας φτάνει στην αποθήκη. Ένας δαίμονας που εκτελείται ως root συνήθως δεν μπορεί να διαβάσει στοιχείο της κλειδοθήκης σύνδεσης, και αυτή είναι η λεπτομέρεια που εμφανίζεται μόνο στο πλαίσιο του συστήματος.

Ορίστε τι σημαίνει ετοιμότητα και δοκιμάστε την εκεί

Μια επιτυχημένη εκκίνηση αποδεικνύει ότι η διεργασία ξεκίνησε. Δεν αποδεικνύει ότι το δίκτυο είναι ενεργό, ότι η πύλη δέχτηκε την ταυτότητα ή ότι η ιδιωτική εφαρμογή είναι προσβάσιμη. Αν κάτι άλλο εξαρτάται από τη σήραγγα, χρειάζεται σήμα ετοιμότητας που αντανακλά τη σύνδεση, όχι την ώρα έναρξης της εργασίας.

Οι επαναλήψεις πρέπει να είναι φραγμένες και να ξεχωρίζουν ένα απόν δίκτυο από ένα απορριφθέν διαπιστευτήριο. Η επανεκκίνηση σε κάθε αποτυχία δεν επισκευάζει ληγμένο πιστοποιητικό και παράγει αρχείο καταγραφής γεμάτο πανομοιότυπες προσπάθειες που κρύβει την πραγματική.

Δεχτείτε την εργασία στο πλαίσιο όπου θα εκτελεστεί πραγματικά: χωρίς δίκτυο στην εκκίνηση, με κανονική σύνδεση, με αφύπνιση από ύπνο και με ελεγχόμενη διακοπή. Στη συνέχεια καταγράψτε μαζί την ετικέτα της εργασίας, την έκδοση του πελάτη και την αναθεώρηση του προφίλ, ώστε το επόμενο άτομο να κληρονομήσει μια υπηρεσία με σαφή προέλευση αντί για ένα αρχείο που κάποτε λειτούργησε.

Σχετικά άρθρα