Ένα traceback εμφανίζεται όταν ξεκινά μια εντολή διαχείρισης VPN, και η πρώτη παρόρμηση είναι να εγκαταστήσετε ένα διαφορετικό Python ή να στρέψετε το προεπιλεγμένο του συστήματος αλλού. Αυτή η παρόρμηση αναμειγνύει δύο περιβάλλοντα εκτέλεσης που δεν έχουν καμία σχέση μεταξύ τους. Το ένα ανήκει στο λειτουργικό σύστημα και στα πακέτα εργαλείων του· το άλλο ανήκει σε όποιο έργο κι αν χτίζετε. Το να αλλάξετε το πρώτο για να ικανοποιήσετε το δεύτερο είναι ο τρόπος με τον οποίο ένας λειτουργικός υπολογιστής χάνει τον διαχειριστή πακέτων του.

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

Δύο ερωτήματα για το Python που μοιάζουν με ένα

Το πρώτο ερώτημα είναι: ποιος διερμηνέας εκτέλεσε το πρόγραμμα που τύπωσε το traceback; Το δεύτερο είναι: ποιον διερμηνέα πρέπει να χρησιμοποιεί το έργο μου; Φαίνονται ίδια σε ένα τερματικό, γιατί και στα δύο απαντάτε πληκτρολογώντας python3, και έχουν διαφορετικούς ιδιοκτήτες, διαφορετικές διαδρομές αναβάθμισης και διαφορετική ακτίνα επιπτώσεων.

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

Μόνο μία από αυτές τις ενέργειες είναι αναστρέψιμη σε ένα λεπτό. Δεν είναι η πρώτη.

Ποιο στοιχείο παρήγαγε το σφάλμα

Διαβάστε την πρώτη γραμμή του traceback και το εκτελέσιμο που το παρήγαγε πριν διαβάσετε οτιδήποτε άλλο. Το frontend της γραμμής εντολών, η προνομιούχος υπηρεσία και οι δεσμεύσεις του API είναι ξεχωριστά κομμάτια, και μόνο μερικά από αυτά είναι Python.

command -v openvpn3
head -n 1 "$(command -v openvpn3)"
dpkg -S "$(command -v openvpn3)" 2>/dev/null
systemctl status openvpn3-service-client --no-pager

Η πρώτη γραμμή ενός script ονομάζει τον διερμηνέα που θα χρησιμοποιήσει, και από αυτόν τον διερμηνέα προήλθε το traceback. Το ερώτημα πακέτου σάς λέει ποιος κατέχει το αρχείο, κάτι που καθορίζει ποιος επιτρέπεται να το αλλάξει. Η κατάσταση της υπηρεσίας απαντά σε ένα εντελώς διαφορετικό ερώτημα: αν τρέχει το προνομιούχο backend που πράγματι συνδέει συνεδρίες.

Ένα σφάλμα εισαγωγής μονάδας, μια άρνηση ενεργοποίησης D-Bus και ένα διαπιστευτήριο που απορρίφθηκε είναι τρία διαφορετικά στάδια. Το σφάλμα εισαγωγής συμβαίνει πριν υπάρξει οποιαδήποτε συνεδρία, οπότε καμία ρύθμιση VPN δεν θα το διορθώσει, και μια λειτουργική υπηρεσία δεν θα το διορθώσει επίσης. Η ταξινόμηση του μηνύματος σε ένα από αυτά τα τρία στάδια είναι το πραγματικό πρώτο βήμα.

Τι μπορεί και τι δεν μπορεί να διορθώσει ένα περιβάλλον έργου

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

uv run --python 3.11 app.py
python3 -c 'import openvpn3; print(openvpn3.__file__)'

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

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

Γιατί η ανακατεύθυνση του διερμηνέα του συστήματος είναι παγίδα

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

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

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

Ξεχωριστές δοκιμές αποδοχής

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

openvpn3 sessions-list
openvpn3-service-client --help 2>/dev/null | head -n 3
ip -4 addr show tun0

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

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

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