Πώς να εκτελέσετε ένα πρόγραμμα Linux κατά την εκκίνηση με το systemd

Θέλετε να ξεκινήσετε ένα πρόγραμμα Linux κατά την εκκίνηση; Το λογισμικό systemd παρέχει έναν τρόπο να το κάνετε σε οποιαδήποτε διανομή Linux με το systemd—που είναι οι περισσότερες από αυτές σήμερα, συμπεριλαμβανομένου του Ubuntu. Θα σας καθοδηγήσουμε στη διαδικασία δημιουργίας μιας ολοκληρωμένης υπηρεσίας—και θα μιλάει ακόμη και στο περιοδικό.

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

Εκτέλεση προγραμμάτων κατά την εκκίνηση

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

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

Τα προγράμματα που εκτελούνται στο παρασκήνιο καλούνται δαίμονες ή υπηρεσίες. Το “d” στο τέλος του systemd σημαίνει δαίμονας. Σε αυτό το άρθρο, θα δημιουργήσουμε ένα παράδειγμα υπηρεσίας. Για να επιλέξετε όλα τα πλαίσια, η υπηρεσία μας πρέπει να είναι:

Ενσωματωμένο στο systemd μέσω αρχείου μονάδας σέρβις
Ξεκίνησε κατά την εκκίνηση
Ελεγχόμενο με χρήση systemctl, το διεπαφή ελέγχου για το systemd
Δυνατότητα γραφής στο περιοδικό

Δημιουργία του προγράμματος εξυπηρέτησης

Πρέπει να έχουμε ένα πρόγραμμα που θα ξεκινήσει το systemd. Θα δημιουργήσουμε ένα απλό σενάριο, που ονομάζεται “htg.sh”. Αυτό το σεμινάριο χρησιμοποιεί το πρόγραμμα επεξεργασίας κειμένου Gedit, αλλά μπορείτε να χρησιμοποιήσετε όποιο πρόγραμμα επεξεργασίας κειμένου προτιμάτε.

touch htg.sh
gedit htg.sh

Θα ανοίξει το πρόγραμμα επεξεργασίας gedit. Αντιγράψτε και επικολλήστε το παρακάτω κείμενο στο πρόγραμμα επεξεργασίας.

#!/bin/bash

echo "htg.service: ## Starting ##" | systemd-cat -p info

while :
do
TIMESTAMP=$(date '+%Y-%m-%d %H:%M:%S')
echo "htg.service: timestamp ${TIMESTAMP}" | systemd-cat -p info
sleep 60
done

Αποθηκεύστε τις αλλαγές σας και κλείστε το πρόγραμμα επεξεργασίας.

  Πώς να παίξετε το Battlefield V στο Linux

Το σενάριο δεν κάνει πολλά, αλλά υπάρχουν μερικά σημεία που αξίζει να σημειωθούν.

Οι δύο γραμμές ηχούς διοχετεύονται μέσω του systemd-cat, ενός προγράμματος που παίρνει το εξόδου από ένα πρόγραμμα και το στέλνει στο περιοδικό. Οι καταχωρήσεις στο περιοδικό έχουν προτεραιότητα. Χρησιμοποιούμε την επιλογή -p (προτεραιότητα) για να υποδείξουμε ότι τα μηνύματά μας είναι μόνο για ενημέρωση (πληροφορίες). Δεν είναι σημαντικά λάθη ή προειδοποιήσεις.
Υπάρχει ένας ατελείωτος βρόχος while.
Η μεταβλητή TIMESTAMP ορίζεται στην τρέχουσα ημερομηνία και ώρα. Αυτό μορφοποιείται σε μήνυμα και αποστέλλεται στο ημερολόγιο.
Στη συνέχεια, το σενάριο κοιμάται για 60 δευτερόλεπτα.
Μετά από 60 δευτερόλεπτα ο βρόχος επαναλαμβάνεται. Έτσι, αυτό το σενάριο γράφει ένα μήνυμα με χρονική σήμανση στο περιοδικό μία φορά το λεπτό.

Θα αντιγράψουμε το σενάριο στον κατάλογο /usr/local/bin.

sudo cp htg.sh /usr/local/bin

Και πρέπει να το κάνουμε εκτελέσιμο:

sudo chmod +x /usr/local/bin/htg.sh

Δημιουργία του αρχείου της μονάδας υπηρεσίας

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

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

sudo systemctl list-unit-files --type-service

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

Η υπηρεσία μας θα ονομάζεται “htg.service”. Κανένα αρχείο μονάδας δεν έχει αυτό το όνομα, επομένως μπορούμε να προχωρήσουμε και να δημιουργήσουμε το αρχείο μονάδας μας.

sudo gedit /etc/systemd/system/htg.service

Θα ανοίξει το πρόγραμμα επεξεργασίας gedit. Αντιγράψτε και επικολλήστε το ακόλουθο κείμενο στον επεξεργαστή:

[Unit]
Description=How-To Geek Service Example

Wants=network.target
After=syslog.target network-online.target

[Service]
Type=simple
ExecStart=/usr/local/bin/htg.sh
Restart=on-failure
RestartSec=10
KillMode=process

[Install]
WantedBy=multi-user.target

Αποθηκεύστε τις αλλαγές σας και κλείστε το πρόγραμμα επεξεργασίας.

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

  Πώς να παίξετε τα κλασικά παιχνίδια Fallout στο Linux

Περιγραφή: Αυτή είναι μια περιγραφή κειμένου της υπηρεσίας σας.
Θέλει: Η υπηρεσία μας θέλει —αλλά δεν απαιτεί— το δίκτυο να λειτουργεί πριν ξεκινήσει η υπηρεσία μας.
Μετά: Μια λίστα με τα ονόματα των μονάδων που θα πρέπει να ξεκινήσουν μετά την επιτυχή εκκίνηση αυτής της υπηρεσίας, εάν δεν εκτελούνται ήδη.
Τύπος: Απλό. Το systemd θα θεωρήσει ότι αυτή η υπηρεσία ξεκίνησε μόλις ολοκληρωθεί η διαδικασία που καθορίζεται από το ExecStart.
ExecStart: Η διαδρομή προς τη διαδικασία που πρέπει να ξεκινήσει.
Επανεκκίνηση: Πότε και εάν πρέπει να γίνει επανεκκίνηση της υπηρεσίας. Το έχουμε ρυθμίσει σε “on-failure”.
RestartSec: Πόσος χρόνος πρέπει να περιμένετε πριν επιχειρήσετε να επανεκκινήσετε την υπηρεσία. Αυτή η τιμή είναι σε δευτερόλεπτα.
KillMode: Καθορίζει πώς το systemd θα πρέπει να σκοτώσει τη διαδικασία εάν ζητήσουμε από το systemctl να σταματήσει την υπηρεσία. Έχουμε αυτό το σύνολο σε “επεξεργασία”. Αυτό κάνει το systemd να χρησιμοποιεί το σήμα SIGTERM μόνο στην κύρια διεργασία. Εάν η υπηρεσία μας ήταν ένα μη τετριμμένο πρόγραμμα αντί για ένα απλό σενάριο, θα το ρυθμίζαμε σε “μικτό” για να διασφαλίσουμε ότι θα τερματίζονταν και οποιεσδήποτε προκύπτουσες διεργασίες.
WantedBy: Το έχουμε ορίσει σε “multi-user.target”, που σημαίνει ότι η υπηρεσία θα πρέπει να ξεκινήσει όσο το σύστημα βρίσκεται σε κατάσταση όπου πολλοί χρήστες μπορούν να συνδεθούν, ανεξάρτητα από το αν υπάρχει ή όχι μια γραφική διεπαφή χρήστη.

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

Αυτή η εντολή θα δώσει στον κάτοχο δικαιώματα ανάγνωσης και εγγραφής και δικαιώματα ανάγνωσης στην ομάδα. Άλλοι δεν θα έχουν δικαιώματα.

sudo chmod 640 /etc/systemd/system/htg.service

Μπορούμε να βάλουμε το systemctl να ελέγξει τη σύνταξη του αρχείου της μονάδας μας, ακόμα κι αν η υπηρεσία δεν εκτελείται ακόμα. Τυχόν σφάλματα θα αναφέρονται. (Στην πραγματικότητα, το τμήμα “.service” είναι προαιρετικό για τις περισσότερες εντολές.)

systemctl status htg.service

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

  Πώς να αναλύσετε τη χρήση σκληρού δίσκου σε Linux με το Qdirstat

Έναρξη της Υπηρεσίας

Όταν προσθέτετε ένα νέο αρχείο μονάδας ή επεξεργάζεστε ένα υπάρχον, πρέπει να πείτε στο systemd να φορτώσει ξανά τους ορισμούς του αρχείου μονάδας.

sudo systemctl daemon-reload

Εάν θέλετε να ξεκινήσει μια υπηρεσία κατά την εκκίνηση, πρέπει να την ενεργοποιήσετε:

sudo systemctl enable htg

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

sudo systemctl start htg

Επαλήθευση της Υπηρεσίας

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

sudo systemctl status htg.service

Εμφανίζεται για εμάς η κατάσταση της υπηρεσίας.

Η πράσινη κουκκίδα σημαίνει ότι η υπηρεσία μας λειτουργεί και λειτουργεί ομαλά.
Το όνομα της υπηρεσίας είναι “htg.service”, και η μεγάλη περιγραφή είναι αυτή που παρέχουμε στο αρχείο μονάδας.
Μας φαίνεται ποιο αρχείο μονάδας έχει φορτωθεί “/etc/systemd/system/htg.service”.
Η υπηρεσία είναι ενεργή και η ώρα εκκίνησης της υπηρεσίας αναφέρεται για εμάς.
Το PID του είναι 7762.
Υπάρχουν δύο εργασίες που σχετίζονται με την υπηρεσία.
Συνολικά 928 Kibibytes μνήμης χρησιμοποιούνται από την υπηρεσία.
Η ομάδα ελέγχου περιλαμβάνει το σενάριο “htg.sh” και την εντολή ύπνου, η οποία έχει ξεκινήσει από το “htg.sh”. Τις περισσότερες φορές, η εντολή αναστολής λειτουργίας θα κάνει τη δουλειά για αυτήν την υπηρεσία.

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

Διακοπή και απενεργοποίηση της υπηρεσίας

Εάν πρέπει να διακόψετε την υπηρεσία, μπορείτε να το κάνετε με αυτήν την εντολή:

sudo systemctl stop htg.service

Αυτό διακόπτει την υπηρεσία, αλλά δεν την εμποδίζει να επανεκκινηθεί την επόμενη φορά που θα επανεκκινηθεί ο υπολογιστής. Για να σταματήσετε την εκκίνηση της υπηρεσίας κατά την εκκίνηση, πρέπει να την απενεργοποιήσετε:

sudo systemctl disable htg.service

Εάν η υπηρεσία εκτελείται, αυτή η εντολή δεν τη σταματά. Απλώς λέει στο systemd να μην εκκινήσει την υπηρεσία στην επόμενη επανεκκίνηση.

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

Συμβουλή εξυπηρέτησης

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