Πώς να δημιουργήσετε και να εκτελέσετε νέες μονάδες υπηρεσιών στο Systemd


Πριν από λίγες μέρες, συνάντησα μια διανομή Centos 8 32 bit και ένιωσα την επιθυμία να τη δοκιμάσω σε ένα παλιό μηχάνημα 32 bit. Μετά την εκκίνηση, συνειδητοποίησα ότι είχε ένα σφάλμα και έχανε τη σύνδεση δικτύου, την οποία έπρεπε να «επάνω» χειροκίνητα κάθε φορά μετά την εκκίνηση. Λοιπόν, το ερώτημα ήταν πώς θα μπορούσα να ορίσω ένα σενάριο κάνοντας αυτή τη δουλειά, να τρέχει κάθε φορά που εκκινώ το μηχάνημά μου;

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

Σε αυτό το άρθρο, θα εξηγήσω τι είναι μια "μονάδα υπηρεσιών" στο systemd και πόσο εύκολο είναι να δημιουργήσετε και να εκτελέσετε μία. Θα προσπαθήσω να απλοποιήσω τι είναι οι "στόχοι ", γιατί τους ονομάζουμε "συλλογές μονάδων " και ποια είναι τα "θέλω " τους. Τέλος, εκμεταλλευόμαστε μια μονάδα εξυπηρέτησης για να τρέξουμε το δικό μας σενάριο μετά τη διαδικασία εκκίνησης.

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

Άλλες υπηρεσίες καλούνται να εκτελεστούν όταν ο υπολογιστής φτάσει, για παράδειγμα, στο επίπεδο διάσωσης (επίπεδο εκτέλεσης 0) και άλλες όταν φτάσει στο επίπεδο πολλών χρηστών (επίπεδο εκτέλεσης 3) . Μπορείτε να φανταστείτε αυτά τα επίπεδα ως στόχους.

Με απλό τρόπο, ο στόχος είναι μια συλλογή μονάδων εξυπηρέτησης. Εάν θέλετε να ρίξετε μια ματιά στις μονάδες υπηρεσιών που εκτελούνται στο επίπεδο graphical.target σας, πληκτρολογήστε:

systemctl --type=service

Όπως μπορείτε να δείτε, ορισμένες υπηρεσίες είναι ενεργές και "τρέχουν" συνεχώς, ενώ άλλες εκτελούνται μία φορά και τερματίζονται (έξοδος).

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

systemctl status firewalld.service

Όπως μπορείτε να δείτε, έλεγξα την κατάσταση του firewalld.service (συμβουλή: μπορείτε να χρησιμοποιήσετε την αυτόματη συμπλήρωση για το όνομα της υπηρεσίας ). Με ενημερώνει ότι η υπηρεσία firewalld εκτελείται συνεχώς και είναι ενεργοποιημένη.

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

Για παράδειγμα, αν πληκτρολογήσετε:

systemctl stop firewalld.service
systemctl status firewalld.service

Μπορείτε να δείτε ότι το firewalld.service είναι ανενεργό (νεκρό) αλλά εξακολουθεί να είναι ενεργοποιημένο, πράγμα που σημαίνει ότι κατά την επόμενη εκκίνηση θα φορτωθεί. Επομένως, εάν θέλουμε να φορτωθεί μια υπηρεσία κατά τη διάρκεια της εκκίνησης στο μέλλον, πρέπει να την ενεργοποιήσουμε. Τι υπέροχο συμπέρασμα! Ας δημιουργήσουμε ένα, είναι εύκολο.

Εάν μεταβείτε στον φάκελο:

cd /etc/systemd/system
ls -l

Μπορείτε να δείτε ορισμένα αρχεία συνδέσμων υπηρεσιών μονάδας και ορισμένους καταλόγους των «θέλω» ενός στόχου. Για παράδειγμα, αυτό που θέλει να φορτωθεί ο στόχος πολλών χρηστών όταν η διαδικασία εκκίνησης φτάσει στο επίπεδό της, παρατίθεται στον κατάλογο με όνομα /etc/systemd/system/multi-user.target.wants/ .

ls multi-user.target.wants/

Όπως μπορείτε να δείτε, δεν περιέχει μόνο υπηρεσίες αλλά και άλλους στόχους που είναι επίσης συλλογές υπηρεσιών.

Ας φτιάξουμε μια μονάδα εξυπηρέτησης με το όνομα connection.service.

vim connection.service

και πληκτρολογήστε τα εξής (πατήστε “i ” για λειτουργία εισαγωγής), αποθηκεύστε το και βγείτε (με “esc ” και “:wq! ” ):

[Unit]
Description = making network connection up
After = network.target

[Service]
ExecStart = /root/scripts/conup.sh

[Install]
WantedBy = multi-user.target

Για να εξηγήσουμε τα παραπάνω: δημιουργήσαμε μια μονάδα τύπου υπηρεσίας (μπορείτε επίσης να δημιουργήσετε μονάδες τύπου προορισμού) και την έχουμε ορίσει να φορτώνεται μετά το network.target (μπορείτε να καταλάβετε ότι το η διαδικασία εκκίνησης φτάνει τους στόχους με μια καθορισμένη σειρά) και θέλουμε κάθε φορά που ξεκινά η υπηρεσία να εκτελεί ένα σενάριο bash με το όνομα conup.sh που πρόκειται να δημιουργήσουμε.

Η διασκέδαση ξεκινά με το τελευταίο μέρος [εγκατάσταση]. Λέει ότι θα ζητηθεί από το “multi-user.target”. Έτσι, εάν ενεργοποιήσουμε την υπηρεσία μας, θα δημιουργηθεί ένας συμβολικός σύνδεσμος προς αυτήν την υπηρεσία μέσα στο φάκελο multi-user.target.wants! Το έπιασα? Και αν το απενεργοποιήσουμε, αυτός ο σύνδεσμος θα διαγραφεί. Τόσο απλό.

Απλώς ενεργοποιήστε το και ελέγξτε:

systemctl enable connection.service

Μας ενημερώνει ότι έχει δημιουργηθεί ο συμβολικός σύνδεσμος στον φάκελο multi-user.target.wants. Μπορείτε να επιβεβαιώσετε εκτελώντας την εντολή ls όπως φαίνεται.

ls multi-user.target.wants/

Όπως μπορείτε να δείτε το “connection.service” είναι έτοιμο για την επόμενη εκκίνηση, αλλά πρέπει πρώτα να δημιουργήσουμε το αρχείο σεναρίου.

cd /root
mkdir scripts
cd scripts
vim conup.sh

Προσθέστε την ακόλουθη γραμμή στο Vim και αποθηκεύστε την:

#!/bin/bash
nmcli connection up enp0s3

Η εντολή nmcli για να εμφανιστεί η σύνδεση δικτύου για τη διεπαφή enp0s3.

Φυσικά, εάν θέλετε το σενάριό σας να εκτελεί κάτι άλλο, μπορείτε να πληκτρολογήσετε ό,τι θέλετε αντί για τη δεύτερη γραμμή.

Για παράδειγμα,

#!/bin/bash
touch /tmp/testbootfile

που θα δημιουργούσε ένα αρχείο μέσα στο φάκελο /tmp (απλώς για να ελέγξετε ότι η υπηρεσία σας λειτουργεί).

Πρέπει επίσης να κάνουμε το σενάριο εκτελέσιμο εκτελώντας την εντολή chmod όπως φαίνεται.

chmod +x conup.sh

Τώρα είμαστε έτοιμοι. Εάν δεν θέλετε να περιμένετε μέχρι την επόμενη εκκίνηση (είναι ήδη ενεργοποιημένη), μπορούμε να ξεκινήσουμε την υπηρεσία για την τρέχουσα περίοδο λειτουργίας πληκτρολογώντας:

systemctl start connection.service

Voila! Η σύνδεσή μου είναι σε λειτουργία!

Εάν έχετε επιλέξει να γράψετε την εντολή “touch /tmp/testbootfile ” μέσα στο σενάριο, απλώς για να ελέγξετε τη λειτουργικότητά του, θα δείτε αυτό το αρχείο να δημιουργήθηκε μέσα στο φάκελο /tmp .

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