Ενότητα 6 · 6.1
Διαχείριση υπηρεσιών με το systemd
Ενότητα 6: Υπηρεσίες και αρχεία καταγραφής · Χρόνος ανάγνωσης: 10 λεπτά
Στόχος μαθήματος: Μετά από αυτό το μάθημα μπορείτε να ξεκινάτε, να σταματάτε και να επαναφορτώνετε υπηρεσίες και να τις ρυθμίζετε ώστε να ξεκινούν κατά την εκκίνηση του συστήματος. Μπορείτε επίσης να διαβάζετε την κατάσταση μιας υπηρεσίας και να αλλάζετε με ασφάλεια μια ρύθμισή της με ένα drop-in.
Βασικές έννοιες: systemd, unit, service, systemctl, start, stop, restart, reload, enable, disable, --now, active, inactive, failed, systemctl --failed, drop-in, systemctl edit, daemon-reload, Restart=
Ποιος κρατά τα πάντα σε λειτουργία;
Σε έναν server εκτελούνται δεκάδες προγράμματα που πρέπει να είναι πάντα διαθέσιμα: ο SSH server, ο web server, μια βάση δεδομένων, ο συγχρονισμός της ώρας. Αυτά τα προγράμματα ονομάζονται υπηρεσίες (services ή daemons). Κάποιος πρέπει να τα ξεκινά κατά την εκκίνηση, να τα παρακολουθεί και να τα επανεκκινεί όταν καταρρεύσουν. Στα Debian, Ubuntu, AlmaLinux και Rocky Linux αυτό το κάνει το systemd. Είναι το πρώτο πρόγραμμα που ξεκινά ο kernel (διεργασία 1) και στη συνέχεια ξεκινά όλα τα υπόλοιπα.
Το systemd δουλεύει με units: περιγραφές για κάτι που πρέπει να διαχειρίζεται. Οι σημαντικότεροι τύποι:
| Τύπος | Επέκταση | Παράδειγμα |
|---|---|---|
| Υπηρεσία | .service | nginx.service, ssh.service |
| Timer (προγραμματισμένη εργασία) | .timer | apt-daily.timer (μάθημα 4.2, μάθημα 6.3) |
| Socket | .socket | ssh.socket στο Ubuntu 24.04 και νεότερες εκδόσεις |
| Στόχος (ομάδα units) | .target | multi-user.target |
Επικοινωνείτε με το systemd μέσω της εντολής systemctl. Την επέκταση .service μπορείτε να την παραλείψετε: το systemctl status nginx είναι το ίδιο με το systemctl status nginx.service.
Ανάγνωση της κατάστασης
Η εντολή που θα χρησιμοποιείτε συχνότερα:
anna@web1:~$ systemctl status nginx
● nginx.service - A high performance web server and a reverse proxy server
Loaded: loaded (/usr/lib/systemd/system/nginx.service; enabled; preset: enabled)
Active: active (running) since Mon 2026-11-09 08:12:44 CET; 3h 2min ago
Docs: man:nginx(8)
Process: 902 ExecStartPre=/usr/sbin/nginx -t -q -g daemon on; master_process on; (code=exited, status=0/SUCCESS)
Main PID: 905 (nginx)
Tasks: 3 (limit: 2275)
Memory: 4.1M (peak: 6.3M)
CPU: 213ms
CGroup: /system.slice/nginx.service
├─905 "nginx: master process /usr/sbin/nginx -g daemon on; master_process on;"
└─906 "nginx: worker process"
nov 09 08:12:44 web1 systemd[1]: Starting nginx.service - A high performance web server...
nov 09 08:12:44 web1 systemd[1]: Started nginx.service - A high performance web server...Διαβάστε την από πάνω προς τα κάτω:
- Η κουκκίδα πριν από το όνομα είναι πράσινη όταν η υπηρεσία εκτελείται, λευκή όταν έχει σταματήσει και κόκκινη όταν έχει αποτύχει.
- Το Loaded δείχνει πού βρίσκεται το αρχείο unit και αν η υπηρεσία ξεκινά κατά την εκκίνηση (
enabled) ή όχι (disabled). - Το Active δείχνει αν εκτελείται τώρα (
active (running)), αν έχει σταματήσει (inactive (dead)) ή αν έχει αποτύχει (failed), καθώς και από πότε. - Τα Main PID και CGroup δείχνουν ποιες διεργασίες ανήκουν στην υπηρεσία.
- Στο κάτω μέρος εμφανίζονται οι τελευταίες γραμμές από το αρχείο καταγραφής της υπηρεσίας. Συχνά εκεί φαίνεται ήδη γιατί κάτι δεν πάει καλά. Περισσότερα διαβάζετε με το
journalctl(μάθημα 6.2).
Εκκίνηση, διακοπή, επανεκκίνηση και επαναφόρτωση
anna@web1:~$ sudo systemctl start nginx # εκκίνηση τώρα
anna@web1:~$ sudo systemctl stop nginx # διακοπή τώρα
anna@web1:~$ sudo systemctl restart nginx # διακοπή και επανεκκίνηση
anna@web1:~$ sudo systemctl reload nginx # επαναφόρτωση ρυθμίσεων χωρίς διακοπήΗ διαφορά ανάμεσα σε restart και reload είναι σημαντική στην πράξη. Με ένα restart η υπηρεσία σταματά για λίγο: οι ενεργές συνδέσεις διακόπτονται, και αν η νέα ρύθμιση περιέχει σφάλμα, η υπηρεσία δεν ξεκινά ξανά και ο ιστότοπός σας πέφτει. Με ένα reload η υπηρεσία διαβάζει ξανά τη ρύθμισή της ενώ συνεχίζει να εκτελείται. Αν η ρύθμιση έχει σφάλμα, το nginx κρατά την παλιά. Γι' αυτό, μετά από αλλαγή ρυθμίσεων στα nginx, Caddy, SSH και fail2ban, χρησιμοποιήστε reload και ελέγξτε πρώτα τη ρύθμιση (nginx -t, sshd -t, fail2ban-client -t). Δεν υποστηρίζουν όλες οι υπηρεσίες reload. Το systemctl reload-or-restart επιλέγει μόνο του.
Κατά την εκκίνηση: enable και disable
Η εκκίνηση μιας υπηρεσίας και η "εκκίνηση κατά την εκκίνηση του συστήματος" είναι δύο διαφορετικά πράγματα:
anna@web1:~$ sudo systemctl enable nginx # εκκινεί πλέον κατά την εκκίνηση του συστήματος
anna@web1:~$ sudo systemctl disable nginx # όχι πλέον κατά την εκκίνηση του συστήματος
anna@web1:~$ sudo systemctl enable --now nginx # και τα δύο: εκκίνηση τώρα και κατά την εκκίνηση του συστήματος
anna@web1:~$ systemctl is-enabled nginx
enabledΈνα κλασικό λάθος: ξεκινάτε μια υπηρεσία με start, όλα λειτουργούν, και μετά την επόμενη επανεκκίνηση (για παράδειγμα λόγω ενημέρωσης του kernel, μάθημα 4.2) η υπηρεσία έχει χαθεί. Γι' αυτό, για μια νέα υπηρεσία χρησιμοποιήστε enable --now.
Αν θέλετε να είστε βέβαιοι ότι μια υπηρεσία δεν θα ξεκινήσει ποτέ, ακόμη κι αν τη ζητήσει μια άλλη υπηρεσία, υπάρχει το mask: sudo systemctl mask <dienst>. Το αναιρείτε με unmask.
Τι δεν πάει καλά;
Μία εντολή εμφανίζει όλα τα units που έχουν αποτύχει:
anna@web1:~$ systemctl --failed
UNIT LOAD ACTIVE SUB DESCRIPTION
● php8.4-fpm.service loaded failed failed The PHP 8.4 FastCGI Process Manager
1 loaded units listed.Κάντε το συνήθεια, για παράδειγμα μετά από κάθε επανεκκίνηση και κάθε αναβάθμιση (μάθημα 4.3): η λίστα πρέπει να είναι κενή. Αφού λύσετε το πρόβλημα, αφαιρείτε την ειδοποίηση με sudo systemctl reset-failed.
Μια επισκόπηση όλων των υπηρεσιών που εκτελούνται:
anna@web1:~$ systemctl list-units --type=service --state=runningΑν εκτελείται κάτι που δεν γνωρίζετε ή δεν χρησιμοποιείτε, ερευνήστε τι είναι. Κάθε υπηρεσία που δεν χρειάζεται αποτελεί περιττή επιφάνεια επίθεσης (μάθημα 5.1 και 10.1).
Αρχεία unit και drop-ins
Ένα αρχείο unit είναι ένα αρχείο κειμένου. Η έκδοση του πακέτου βρίσκεται στο /usr/lib/systemd/system/ (σε παλαιότερα συστήματα στο /lib/systemd/system/). Αυτό το αρχείο δεν το αλλάζετε ποτέ: μια ενημέρωση του πακέτου θα το αντικαταστήσει. Τις δικές σας αλλαγές τις βάζετε σε ένα drop-in: ένα μικρό αρχείο που περιέχει μόνο τις γραμμές που θέλετε να αλλάξετε. Ο ευκολότερος τρόπος είναι:
anna@web1:~$ sudo systemctl edit nginxΑνοίγει ένας editor με ένα κενό τμήμα ανάμεσα σε δύο γραμμές σχολίων. Ό,τι γράψετε εκεί αποθηκεύεται στο /etc/systemd/system/nginx.service.d/override.conf. Για παράδειγμα: αυτόματη επανεκκίνηση του nginx όταν σταματήσει απροσδόκητα.
[Service]
Restart=on-failure
RestartSec=5sΜετά την αποθήκευση, το systemctl edit επαναφορτώνει αυτόματα τη ρύθμιση του systemd. Αν επεξεργαστείτε ένα αρχείο unit με άλλον τρόπο, εκτελέστε μόνοι σας:
anna@web1:~$ sudo systemctl daemon-reload
anna@web1:~$ sudo systemctl restart nginxΤο daemon-reload κάνει το systemd να διαβάσει ξανά τα αρχεία unit. Η ίδια η υπηρεσία πρέπει μετά να επανεκκινηθεί για να χρησιμοποιήσει την αλλαγή. Το πλήρες αποτέλεσμα (πρωτότυπο μαζί με τα drop-ins) το βλέπετε με systemctl cat nginx.
Το Restart=on-failure είναι καλή πρακτική για σημαντικές υπηρεσίες. Μην κρύβετε όμως με αυτό ένα πραγματικό σφάλμα: μια υπηρεσία που καταρρέει και επανεκκινείται κάθε πέντε δευτερόλεπτα πρέπει να ερευνηθεί στο αρχείο καταγραφής. Το systemd σταματά τις επανεκκινήσεις μετά από μερικές γρήγορες διαδοχικές αποτυχίες (το προεπιλεγμένο όριο είναι πέντε εκκινήσεις μέσα σε δέκα δευτερόλεπτα) και θέτει την υπηρεσία σε failed.
Στα AlmaLinux και Rocky Linux
Τα systemd και systemctl λειτουργούν ακριβώς με τον ίδιο τρόπο. Μόνο τα ονόματα των υπηρεσιών διαφέρουν μερικές φορές: η υπηρεσία SSH ονομάζεται sshd, ο web server της διανομής ονομάζεται httpd (Apache) ή nginx, και το firewall firewalld.
Στην πράξη
Η οθόνη VPS του παρόχου σας (στη WebOké και αλλού) μπορεί να απενεργοποιήσει ολόκληρο τον server, να τον επανεκκινήσει ή να κάνει "αναγκαστική απενεργοποίηση". Το τελευταίο ισοδυναμεί με το να τραβήξετε το καλώδιο από την πρίζα: οι υπηρεσίες δεν έχουν την ευκαιρία να σταματήσουν σωστά και μια βάση δεδομένων μπορεί να καταστραφεί. Μέσα στον server χρησιμοποιήστε sudo systemctl reboot ή sudo shutdown -h now, και στον πίνακα ελέγχου το κανονικό κουμπί τερματισμού ή επανεκκίνησης.
Σύνοψη
- Το systemd ξεκινά και παρακολουθεί όλες τις υπηρεσίες. Το χειρίζεστε με
systemctl. - Το
systemctl statusδείχνει αν μια υπηρεσία εκτελείται, αν ξεκινά κατά την εκκίνηση, καθώς και τις τελευταίες γραμμές καταγραφής. - Τα
start/stop/restartισχύουν για τώρα, ταenable/disableγια την εκκίνηση. Για μια νέα υπηρεσία χρησιμοποιήστεenable --now. - Μετά από αλλαγή ρυθμίσεων: πρώτα έλεγχος, μετά
reload. Τοsystemctl --failedπρέπει να είναι κενό. - Μην αλλάζετε ποτέ το αρχείο unit ενός πακέτου. Χρησιμοποιήστε ένα drop-in με
systemctl edit.
Κουίζ
Άσκηση
Άσκηση O6.1: Χαρτογράφηση των υπηρεσιών σας. Φτιάξτε στον server σας μια λίστα με όλες τις υπηρεσίες που εκτελούνται (systemctl list-units --type=service --state=running) και ελέγξτε αν το systemctl --failed είναι κενό. Για κάθε υπηρεσία σημειώστε τι κάνει και αν τη χρειάζεστε. Για μία υπηρεσία που δεν γνωρίζατε, ερευνήστε τι είναι (systemctl status, man). Στη συνέχεια ορίστε για μία σημαντική υπηρεσία το Restart=on-failure σε ένα drop-in και ελέγξτε με systemctl cat ότι υπάρχει.
Άσκηση O6.1: Χαρτογράφηση των υπηρεσιών σας
Αυτή την άσκηση την κάνετε μόνοι σας: κανείς δεν την ελέγχει. Σημειώστε τι έχετε κάνει και επισημάνετε την άσκηση ως ολοκληρωμένη.
Ένα drop-in βρίσκεται στο /etc/systemd/system/<naam>.service.d/override.conf, όχι στο /usr/lib/systemd. Με το reload η υπηρεσία συνεχίζει να εκτελείται και, για παράδειγμα, το nginx κρατά την παλιά ρύθμιση σε περίπτωση σφάλματος. Ελέγξτε πρώτα με nginx -t ή sshd -t. Περιττές υπηρεσίες: disable --now ή αφαίρεση του πακέτου.
Τα τικ και οι σημειώσεις σας παραμένουν μόνο σε αυτό το πρόγραμμα περιήγησης· δεν τα στέλνουμε πουθενά. Αν έχετε εγγραφεί, αποθηκεύουμε στο Τα μαθήματά μου μόνο ότι έχετε ολοκληρώσει την άσκηση.
Για περαιτέρω μελέτη
- Εγχειρίδιο
systemctl(1): https://manpages.debian.org/trixie/systemd/systemctl.1.en.html - Εγχειρίδιο
systemd.service(5)(Restart=): https://manpages.debian.org/trixie/systemd/systemd.service.5.en.html - Εγχειρίδιο
systemd.unit(5)(drop-ins): https://manpages.debian.org/trixie/systemd/systemd.unit.5.en.html
