systemd timer – εναλλακτικά του cron

ΣΗΜΕΙΩΣΗ: ΑΥΤΗ Η ΔΗΜΟΣΙΕΥΣΗ ΕΧΕΙ ΓΙΝΕΙ ΠΑΝΩ ΑΠΟ ΕΝΑ ΧΡΟΝΟ ΠΡΙΝ!

Μιας και το systemd έχει μπει για τα καλά στην ζωή μας, καλό θα είναι να βλέπουμε και κάνα tutorial σχετικά με αυτό. Παλιοί και νέοι power-users/sysadmins θα πρέπει να μάθουν να διαχειρίζονται το σύστημά τους με τις νέες τεχνολογίες.
Παρακάτω θα δούμε τι είναι το systemd timer, καθώς και ένα παράδειγμα χρήσης.


Τα timers στο systemd δεν είναι κάτι άλλο από unit files. Η ιδιαιτερότητά τους οφείλεται στο ότι ελέγχουν (κοντρολάρουν) τα αντίστοιχα .service files με το ίδιο όνομα.
Λέμε ότι είναι μια εναλλακτική έναντι του cron διότι έχουν κατασκευαστεί για την ίδια δουλειά, να ρυθμίζουν εργασίες οι οποίες πρέπει να εκτελεστούν από το σύστημα. Δεν διαθέτουν (τουλάχιστον όχι ακόμη) όλες τις λειτουργίες του cron, όπως για παράδειγμα την λειτουργία MAILTO, ωστόσο οι περισσότερες εργασίες μπορούν να προγραμματιστούν παρόμοια.
Το αν είναι περισσότερο περίπλοκοι(οι timers) από το cron, εξαρτάται από το πως το βλέπει ο καθένας. Σίγουρα είναι περισσότερο εύκολο να ρίξεις μια γραμμή π.χ. στο cron.daily/ από το να δημιουργήσεις ένα (ή και δυο) νέα αρχεία καθώς και να τρέξεις μερικές systemctl εντολές, αλλά όπως είπαμε πρέπει να εξοικειωνόμαστε με τις νέες τεχνολογίες.

Πάμε να δούμε το παράδειγμα χρήσης.
Έστω ότι βρισκόμαστε σε ένα σύστημα το οποίο δεν διαθέτει auto-trim για SSD δίσκους (κι εμείς έχουμε κάνει την εγκατάστασή μας σε έναν τέτοιο δίσκο). Ένα τέτοιο σύστημα θα μπορούσε να είναι για παράδειγμα το Debian.
Παρακάτω θα φτιάξουμε δυο unit files, το ένα θα είναι με κατάληξη .service ενώ το άλλο με κατάληξη .timer.
Και τα δυο πρέπει να έχουν το ίδιο όνομα. Εδώ θα προτιμήσουμε ως ονόματα τα απλά fstrim.service και fstrim.timer.

Ανοίγουμε ένα τερματικό και ως διαχειριστές δίνουμε την παρακάτω εντολή

gedit /lib/systemd/system/fstrim.service

θα ανοίξει ο κειμενογράφος gedit όπου μέσα γράφουμε τα εξής

[Unit]
Description=Discard unused blocks

[Service]
Type=oneshot
ExecStart=/usr/local/sbin/fstrim-all

Σημασία εδώ έχει το ExecStart όπου καλεί και το script από την συγκεκριμένη διαδρομή και το εκτελεί. Το script πρέπει να έχει δικαιώματα εκτέλεσης.

timer1

Αποθηκεύουμε και φτιάχνουμε και το αντίστοιχο .timer

gedit /lib/systemd/system/fstrim.timer

με τα παρακάτω περιεχόμενα

[Unit]
Description=Discard unused blocks. Start 15 minutes after boot and again every day while the system is running. 
Documentation=man:fstrim

[Timer]
OnBootSec=15
OnCalendar=daily
Persistent=true

[Install]
WantedBy=multi-user.target

timer2

Τι λέει το παραπάνω .timer file με απλά λόγια.
Θέλουμε να καλεί(να ξεκινά) το αντίστοιχο fstrim.service 15 δευτερόλεπτα μετά από κάθε εκκίνηση του συστήματος και έπειτα όσο το σύστημα παραμένει ανοιχτό να εκκινεί την υπηρεσία κάθε ημερολογιακή ημέρα που περνάει. Το τελευταίο είναι χρήσιμο αν για παράδειγμα αφήνουμε το σύστημα ανοιχτό (δεν κάνουμε επανεκκίνηση) για περισσότερο από μια ημέρες.

Το μόνο που έχουμε να κάνουμε από εδώ και πέρα είναι να κάνουμε ένα reload το systemd, να ενεργοποιήσουμε τον timer και να ρίξουμε μια ματιά στους timers γενικότερα.

systemctl daemon-reload 
systemctl enable fstrim.timer
systemctl list-timers

timer3

Η σελίδα τεκμηρίωσης (man page/documentation), αναλυτικότατη και επεξηγηματική, μπορεί να βρεθεί εδώ.

Συμβάλετε κι εσείς με ένα σχόλιο

Ο ιστότοπος χρησιμοποιεί το Akismet για την εξάλειψη των ανεπιθύμητων σχολίων. Μάθετε πως επεξεργάζονται τα δεδομένα των σχολίων σας.