Το ExecStart δεν είναι κέλυφος: διόρθωση μονάδας βοηθού VPN
Το ExecStart εκτελεί ένα πρόγραμμα με ορίσματα, όχι αγωγό κελύφους. Χρησιμοποιήστε ρητό διερμηνέα ή πραγματικό σενάριο, έπειτα επαληθεύστε τη μονάδα και διαβάστε το ημερολόγιο.
Αντιγράψτε μια λειτουργική γραμμή εντολών στο ExecStart, επαναφορτώστε και η μονάδα αποτυγχάνει ή τερματίζει σιωπηλά, επειδή τα ορίσματα αντιμετωπίζονται ως ονόματα αρχείων. Τίποτα δεν είναι χαλασμένο στο systemd. Το ExecStart είναι λίστα ορισμάτων, όχι κέλυφος, οπότε οι αγωγοί, η ανακατεύθυνση και οι συνθήκες χάνουν το νόημά τους μόλις εγκαταλείψουν το τερματικό σας. Αποφασίστε πού ανήκει το κέλυφος και μετά γράψτε μια μονάδα που δηλώνει ακριβώς τι πρέπει να εκτελεστεί.
Γιατί ο αγωγός στο ExecStart δεν κάνει τίποτα
Όταν μια εντολή πληκτρολογείται σε τερματικό, το κέλυφος την αναλύει πρώτο. Χτίζει αγωγό, ανοίγει αρχεία για ανακατεύθυνση και επεκτείνει μεταβλητές πριν ξεκινήσει οποιοδήποτε πρόγραμμα. Το systemd δεν κάνει τίποτα από αυτά: χωρίζει το ExecStart σύμφωνα με τους δικούς του κανόνες και εκτελεί το πρόγραμμα που προκύπτει με αυτά τα ορίσματα. Έτσι το > φτάνει ως κυριολεκτικό όρισμα, και το | παραδίδεται στο πρόγραμμα αντί να συνδέσει δύο διεργασίες. Η μονάδα δεν συμπεριφέρεται λάθος· η σύνταξη εννοούσε κάτι άλλο.
Αυτό είναι σκόπιμο και όχι αμέλεια, γιατί ο προβλέψιμος χειρισμός ορισμάτων κάνει τις μονάδες ελεγχόμενες. Εκπλήσσει μόνο όσους υποθέτουν ότι υπάρχει κέλυφος.
Γράψτε μια μονάδα που λέει ακριβώς τι εκτελείται
Ξεκινήστε με μια μικρή μονάδα της οποίας ο σκοπός φαίνεται στο ημερολόγιο, ώστε τα προβλήματα ανάλυσης να μένουν χωριστά από τα προβλήματα της σήραγγας. Αυτή αναφέρει μόνο την έκδοση ενός δυαδικού.
[Unit]
Description=Report the installed OpenVPN version
[Service]
Type=oneshot
ExecStart=/usr/sbin/openvpn --version
StandardOutput=journal
StandardError=journalΗ διαδρομή είναι σύμβολο θέσης, οπότε αντικαταστήστε την με το δυαδικό που είναι πράγματι εγκατεστημένο. Type=oneshot ταιριάζει σε εντολή που εκτελείται μέχρι τέλους, και οι ρυθμίσεις ημερολογίου βάζουν την έξοδό της εκεί όπου μπορείτε να τη διαβάσετε χωρίς τερματικό. Δεν υπάρχει σκόπιμα τμήμα εγκατάστασης, οπότε η μονάδα καλείται με το χέρι αντί να ενεργοποιείται στην εκκίνηση. Επαληθεύστε το αρχείο πριν το ξεκινήσετε, γιατί ένα τυπογραφικό λάθος σε όνομα οδηγίας αποτυγχάνει διαφορετικά από ένα λάθος στη διαδρομή.
systemd-analyze verify /etc/systemd/system/openvpn-version.service
systemctl start openvpn-version.serviceΚρατήστε τη λογική του κελύφους σε σενάριο
Όταν ένας βοηθός χρειάζεται πραγματικά υπό συνθήκη λογική, βάλτε αυτή τη λογική σε σενάριο και καλέστε το ρητά. Το σενάριο χρειάζεται γραμμή διερμηνέα, άδεια εκτέλεσης και κωδικούς εξόδου που η υπηρεσία μπορεί να αναφέρει. Η εκκίνηση του /bin/sh -c με εντολή σε εισαγωγικά λειτουργεί, αλλά κρύβει τους κανόνες εισαγωγικών μέσα σε μια μονάδα και δυσκολεύει την ανασκόπηση. Ένα ονομαστικό σενάριο μπορεί να δοκιμαστεί με το χέρι και να αντικατασταθεί αργότερα χωρίς επεξεργασία της μονάδας. Μην βασίζεστε στο προφίλ κελύφους του διαδραστικού χρήστη, γιατί μια υπηρεσία ξεκινά με το δικό της περιβάλλον.
Ορίστε το WorkingDirectory όταν έχουν σημασία οι σχετικές διαδρομές, και περνάτε το περιβάλλον μέσω των υποστηριζόμενων οδηγιών της μονάδας αντί να το εξάγετε σε τερματικό. Τα μυστικά ανήκουν σε προστατευμένα αρχεία ή διαπιστευτήρια, όχι σε λίστες ορισμάτων που μπορεί να καταγράψει το ημερολόγιο.
Ελέγξτε τη μονάδα που υπάρχει πραγματικά
Τα αρχεία drop-in αλλάζουν τη συμπεριφορά χωρίς να αγγίζουν το αρχείο που θυμάστε ότι επεξεργαστήκατε. Διαβάστε τι φόρτωσε ο διαχειριστής και τι ανέφερε η τελευταία εκτέλεση.
systemctl cat vpn-helper.service
journalctl -u vpn-helper.service -n 20 --no-pagerΗ εκτύπωση της μονάδας περιλαμβάνει τα drop-in με σειρά φόρτωσης, και συνήθως από εκεί προέρχεται ένα απρόσμενο ExecStart. Μετά από κάθε αλλαγή, επαναφορτώστε τον διαχειριστή και επιβεβαιώστε ότι ο νέος ορισμός είναι αυτό που εκτυπώνει το systemctl cat. Το ημερολόγιο δείχνει την ακριβή γραμμή εντολών και την κατάσταση εξόδου, κάτι που χωρίζει ένα πρόβλημα ορισμάτων από ένα απόν δυαδικό ή ένα σφάλμα δικαιωμάτων. Έπειτα αποφασίστε αν ο βοηθός ανήκει στον υπάρχοντα κύκλο ζωής του VPN ή αν πρέπει να μείνει χειροκίνητη διάγνωση, γιατί μια δεύτερη διεργασία σήραγγας στο παρασκήνιο δημιουργεί ανταγωνιστικό ιδιοκτήτη.
Μια μονάδα που εκτυπώνει τη σωστή έξοδο κατά παραγγελία είναι ένα καλό πρώτο ορόσημο. Δεν είναι ακόμη σήραγγα και δεν πρέπει να προσποιείται ότι είναι.