systemd

Cron der nächsten Generation mit systemd Erstellen eines Timers

Cron der nächsten Generation mit systemd Erstellen eines Timers
Müssen Sie für die Zukunft eine Aufgabe auf Ihrem Computer planen?? Das mag einfach aussehen – schließlich kann Ihr Geschirrspüler mit Hilfe eines Knopfes warten, bevor er gestartet wird – aber manchmal erledigen Computer so einfache Aufgaben so schwer.Aber wenn Sie etwas Hintergrundwissen haben, haben Sie wahrscheinlich schon davon gehört cron, Diese Software ist voll und ganz darauf ausgerichtet, die richtige Aufgabe zur richtigen Zeit zu starten. Aber dieses Tool wurde wirklich auf Einfachheit ausgelegt und Sie können am Ende böse Überraschungen erleben.Wenn es Ihnen jemals gelungen ist, eine Aufgabe unter Windows zu planen, haben Sie den Windows-Aufgabenplaner verwendet. Es hat standardmäßig eine GUI, macht es aber auch nicht so einfach: Diese beiden Systeme starten einfach einen Prozess zu einem festen Zeitpunkt und Datum.

Um zu verstehen, wie dir systemd dort hilfreich sein kann, nehme ich ein Beispiel.

Welche Fallstricke Systemd-Timer vermeiden werden?

Wenn Sie jemals eine Maschine mit Daten besitzen, die Ihnen wichtig sind, möchten Sie eine Kopie Ihrer Daten an einem anderen, wahrscheinlich sichereren Ort haben. Wenn Sie einen Server verwalten, ist dies obligatorisch: Wie werden Sie schließlich wiederherstellen, wenn Ihre Festplatte ausfällt und Sie die Wiederherstellung von Daten verhindern??

Als verantwortliche Person richten Sie also jede Woche oder jeden Tag ein Backup ein. Sie können es mit cron einrichten, Sie planen es um 4:24 Uhr, aber hier beginnt das Problem: Was ist, wenn Ihr Server aus irgendeinem Grund von 4:10 Uhr bis 4:30 Uhr heruntergefahren wird??

Nun, es ist wahrscheinlich, dass Cron dieses Backup einfach überspringt. Dies kann kritisch sein, wenn dies häufig und im Hintergrund geschieht oder wenn Ihr Code darauf beruht, dass er ausgeführt wird und ansonsten möglicherweise fehlschlägt. Im Allgemeinen passiert dies, wenn Sie eine Bereinigungsaufgabe über Cron einrichten und diese nicht startet. Plötzlich hat Ihr Code möglicherweise nicht mehr genügend Speicherplatz, um fortzufahren, und wird unterbrochen - Es ist eine traurige, so traurige Situation, richtig, Herr Elton John.

Wenn jedoch ein verpasster Start ein Problem sein kann, stellen Sie sich eine Sekunde vor - Wow, John Lennon jetzt? - dass deine Aufgabe zu langsam ist. Wenn Ihre Aufgabe so eingestellt ist, dass sie alle 10 Minuten ausgeführt wird, aber 15 Minuten dauert, starten Cron oder Windows gerne eine andere Aufgabe, auch wenn die aktuelle Aufgabe noch nicht erledigt ist - und so werden 2 Instanzen Ihrer Aufgabe gleichzeitig ausgeführt , das ist die perfektes Rezept zum Katastrophe. Wenn ein Programm gleichzeitig ausgeführt wird, obwohl es nicht dafür ausgelegt ist, wird es wahrscheinlich Dateien, andere Software und Datenbanken beschädigen - und dein Server wird plötzlich zu einem sinkenden Schiff wie Titanic.

OK, vielleicht gehe ich mit Titanic zu weit, aber Sie haben die Idee?. Obwohl systemd nicht viel hätte tun können, um dieses Schiff zu retten, kann es dir bei all diesen Mängeln helfen und dir dank der Fehler, die es vermeidet, einen längeren Weihnachtsurlaub garantieren. Es ist jetzt an der Zeit, zu lernen, wie man Systemd-Timer einrichtet.

So planen Sie ein automatisiertes Server-Backup?

Zuallererst lösen systemd-Timer einen systemd-Dienst aus. Bevor Sie also Ihre Aufgabe planen, müssen Sie sie zuerst zu einem Dienst machen. Glücklicherweise habe ich eine Anleitung zum Erstellen von systemd-Diensten geschrieben. Auf diese Weise wird Ihnen die Arbeitsweise von systemd vorgestellt. Sie sollten es lesen, bevor Sie fortfahren. Es sei denn, Sie genau wissen, was Sie tun, sollte Ihre Systemd-Service-Datei nicht enthalten eine WantedBy=-Einstellung. Wenn Sie Ihren Dienst zu einem bestimmten Zeitpunkt starten möchten, möchten Sie ihn wahrscheinlich nicht beim Booten starten.

Dank des systemd-Dienstsystems ist es unmöglich, dass mehrere Instanzen Ihrer Aufgabe versehentlich ausgeführt werden: Wenn eine Aufgabe bereits ausgeführt wird, wird der Start einfach übersprungen und die aktuell ausgeführte Aufgabe wird ihre Arbeit beenden.

Sobald Sie einen systemd-Dienst planen müssen, erstellen Sie eine Datei mit demselben Dateinamen wie Ihr Dienst, außer dass sie mit . enden sollte .Timer statt .Bedienung. In unserem automatisierten Backup-Beispiel wäre der Dienst automatisch-backup.service und der Timer wäre automatisiert-backup.Timer. Beide Dateien sollten sich im selben Verzeichnis befinden. Wie ich Ihnen im Systemd-Service-Artikel gesagt habe, empfehle ich Ihnen, diese Dateien an einem normalen Ort wie Ihrem Home-Verzeichnis zu schreiben und sie dann in einen systemd-Ordner zu kopieren, sobald Sie Ihre Bearbeitungen abgeschlossen haben.

Lassen Sie mich Ihnen also zeigen, wie unsere Timer-Datei aussieht:

[Einheit]
Description=Planen Sie Backups außerhalb der Stoßzeiten
[Timer]
OnCalendar=*-*-* 03:00:00
RandomizedDelaySec=7200
Persistent=wahr
[Installieren]
WantedBy=timer.Ziel

Ähnlich wie bei systemd-Diensten gibt es 3 Abschnitte. [Unit] oder [Install] funktionieren genauso wie in meinem Systemd-Services-Artikel beschrieben. Bitte beachten Sie, dass WantedBy= hier wichtig ist, da Timer gestartet oder gestoppt werden können. Wenn Sie also systemd nicht anweisen, Ihren Timer während des Bootens zu starten, wird er nie ausgelöst. Timer.target ist ein spezielles systemd-Target für Timer.

Jetzt der Abschnitt [Timer]. Darin finden Sie alle Einstellungen, die sich darauf beziehen, wann der Timer ausgelöst werden soll. Für unser automatisiertes Backup habe ich systemd angewiesen, es zwischen 3 Uhr morgens und 5 Uhr morgens in der Zeitzone des Servers auszuführen. Die genaue Uhrzeit ist an jedem Tag zufällig.

OnCalendar= stellt den Timer in Bezug auf die Zeit Ihres Servers (Wallclock) ein, z. B. jeden Sonntag um 13:00 Uhr. Wenn Sie cron bereits verwendet haben, sollten Sie mit dieser Syntax wirklich vertraut sein. Es hat jedoch einige zusätzliche Vorteile.

Wenn Sie beispielsweise möchten, dass stündlich etwas passiert, können Sie Folgendes tun:

OnCalendar=stündlich

und täglich:

OnCalendar=täglich

Tatsächlich unterstützt es alle der folgenden Werte:

  1. minutiös
  2. stündlich
  3. Täglich
  4. monatlich
  5. wöchentlich
  6. jährlich
  7. vierteljährlich
  8. halbjährlich

Bei diesen Schlüsselwörtern gibt es jedoch ein Problem: Zum Beispiel lösen tägliche Trigger immer eine Mitternacht aus, was in Computersystemen oft eine Spitzenzeit ist. Aus diesem Grund wird empfohlen, RandomizedDelaySec= zu verwenden (die Verwendung ist unten angegeben). Als Backup ist es sowieso keine gute Option: Mitternacht ist nicht außerhalb der Stoßzeiten, es ist eher umgekehrt the. Wir müssen also genauer festlegen, wann diese Aufgabe gestartet werden soll.

Wenn Sie mehr Kontrolle haben möchten, können Sie ein Datum wie 2018-12-06 12:49:37 eingeben. Nun, wenn Sie so spezifisch sind, lösen Sie den Timer nur einmal aus. Um es wiederkehrend zu machen, ersetzen Sie jedes dieser Elemente durch * Sternchen.

OnCalendar=*-*-* 03:00:00

Wie Sie oben sehen können, ist in unserem Backup-Beispiel der gesamte Datumsteil *-*-*, was bedeutet, dass er jeden Tag jedes Monats jedes Jahres auftreten sollte. Wenn Sie es jetzt tun:

OnCalendar=*-12-25 03:00:00

Dann läuft es jeden 25. Dezember um 3 Uhr morgens. Perfekter System-Timer für den Weihnachtsmann - Auch wenn ich bezweifle, dass er jemals einen brauchen wird! Sternchen fügt also Wiederholungen dort hinzu, wo Sie es eingefügt haben. Wenn Sie es in das Jahresfeld eingeben, bedeutet es "jedes Jahr", usw.

Schließlich können Sie UTC am Ende der Zeile hinzufügen, um die UTC-Zeit anstelle der lokalen Zeitzone zu verwenden. Einige Dienste setzen beispielsweise ihre API-Kontingente um Mitternacht zurück, verwenden jedoch UTC ., um Zeitzonenabweichungen zu vermeiden. Für solche Aufgaben würden Sie also Folgendes tun:

OnCalendar=tägliche UTC

Lassen Sie uns nun ein weiteres Problem lösen: die Hauptverkehrszeiten. systemd hat auch eine Einstellung, um dagegen anzukämpfen.

RandomizedDelaySec= ermöglicht es, die Aufgabe um einen zufälligen Zeitraum zu verzögern. Der Wert ist die maximale Anzahl von Sekunden, die der Timer verzögert. Es ist speziell für solche Fälle gedacht. Sie erinnern sich, dass in systemd täglich immer um Mitternacht ausgelöst wird? Nun, wöchentliche Trigger werden immer um Mitternacht am Montag und jährliche Trigger um Mitternacht am 1. Januar ausgelöst, einer der schlimmsten Spitzen des Jahres mit Netzwerkausfällen überall. Das willst du bestimmt nicht.

Indem Sie eine Verzögerung hinzufügen, beseitigen Sie dieses Problem: Ihre Aufgabe wird automatisch zu einem unbekannten Zeitpunkt verzögert. Der Zufall ist hier wichtig, weil er viel wahrscheinlicher ist, wenn er zufällig ist und eine gleichmäßige Last es ermöglicht, Ihre Aufgaben besser zu optimieren.

Angenommen, Sie müssen Ihre Aufgaben gegen 7 Uhr morgens ausführen, möchten aber eine kleine Verzögerung von maximal 15 Minuten zulassen, gehen Sie wie folgt vor:

RandomizedDelaySec=900

Das sollte für Verzögerungen reichen. Manchmal reichen sogar Millisekunden Verzögerungen aus, um unbeabsichtigte Spitzen zu verhindern.

Persistent= kümmert sich um verpasste Timer-Trigger. Was ist, wenn Ihr Server nachts heruntergefahren wird?? Nun, das Backup würde nie auslösen. Wenn es auf true gesetzt wird, kann es in solchen Fällen von systemd beim nächsten Booten ausgeführt werden. Auf diese Weise wissen Sie auf die eine oder andere Weise, dass die Aufgabe des Timers ausgeführt wird. Die Verwendung ist einfach, Sie tun es einfach:

Persistent=wahr

Dies hat jedoch einen Nachteil, der sowieso nur schwer zu vermeiden ist: Wenn mehrere Aufgaben von verschiedenen Timern verpasst werden, werden sie alle beim Booten ausgeführt und verlangsamen den Bootvorgang. Meiner Meinung nach ist das viel besser, als wenn er nie läuft und schließlich ist das normal, der beste Moment um den Timer laufen zu lassen ist, wenn er geplant ist, danach wird es wahrscheinlich sowieso unpassend sein.

OnBootSec= ist die letzte Option, die ich Ihnen zeige (aber nicht die geringste). Es ist, wenn Sie einen Timer einige Zeit nach dem Booten auslösen möchten, anstatt basierend auf dem Kalender. Wenn Sie beispielsweise beim Start überprüfen müssen, ob Ihr Server ordnungsgemäß gestartet wurde und wie vorgesehen funktioniert, können Sie einen Prüfdienst schreiben und diese Timer-Einstellung verwenden, um ihn auszulösen, nachdem das System genügend Zeit zum Booten hatte.

Nehmen wir an, das System braucht 3 Minuten zum Booten, Sie könnten Folgendes tun:

OnBootSec=180

Und trotz seines Namens können Sie auch Folgendes tun:

OnBootSec=3 Minuten

Wenn Sie sowohl OnBootSec= als auch OnCalendar= angeben, wird der Dienst jedes Mal gestartet, wenn eines dieser beiden Ereignisse eintritt.

Okay, jetzt ist es an der Zeit, deine Datei zu speichern, sie in den Systemordner zu kopieren, wenn du meine obigen Ratschläge befolgt hast, und teste, ob dein Timer richtig funktioniert.

Aktivieren Sie Ihren neuen Timer und die Überwachung

Um Ihren neuen Timer zu testen, müssen Sie systemd mitteilen, dass Sie einen neuen Timer hinzugefügt haben, also müssen Sie diesen Befehl eingeben:

$ sudo systemctl daemon-reload

Jetzt berücksichtigt systemd Ihren neuen Timer und schaut genau hin, wann Ihre Aufgabe ausgeführt werden soll. Da systemd immer läuft, ist es schließlich einer der besten Kandidaten, um Ihre geplanten Aufgaben zu verwalten und auszuführen run.

Eine Sache könnte jedoch kontraintuitiv sein: Ein Timer ist standardmäßig deaktiviert. Um es zu aktivieren, müssen Sie diesen Befehl ausführen:

$ sudo systemctl enable --now automatic-backup.Timer

Sie werden dann wahrscheinlich sehen wollen, ob Ihr Timer wie erwartet funktioniert acts. Gute Nachrichten: systemd ist sogar so nett, einen Befehl zu haben, der Ihnen sagt, wann es zuletzt gestartet wurde und wann der nächste Start geplant ist (außer wenn der Timer so eingestellt ist, dass er nur beim Booten läuft, da systemd natürlich nicht weiß, wann das System wieder bootet). Hier ist dieser Befehl:

$ systemctl status automatisch-backup.Timer

Wenn Sie den Timer schließlich nicht mehr benötigen, können Sie ihn auch deaktivieren:

$ sudo systemctl disable --now automatic-backup.Timer

Fazit

Mit systemd-Timern ist Ihre Verwaltung geplanter Aufgaben auf einem nächsten Level: Ehrlich gesagt finde ich persönlich, dass geplante Aufgaben schon seit Jahren so hätten sein sollen.

Oh, eine kleine Überraschung für dich: alle Systemd-Timer werden in einem gut strukturierten System mit Filterung, Log-Rotation und ähnlichem protokolliert. Daher lade ich Sie ein, zu sehen, wie Sie Protokolle zu Ihren geplanten Aufgaben anzeigen können!

Steuern und verwalten Sie Mausbewegungen zwischen mehreren Monitoren in Windows 10
Dual-Display-Maus-Manager lässt Sie die Mausbewegung zwischen mehreren Monitoren steuern und konfigurieren, indem Sie ihre Bewegungen in der Nähe der ...
Mit WinMouse können Sie die Mauszeigerbewegung auf einem Windows-PC anpassen und verbessern improve
Wenn Sie die Standardfunktionen Ihres Mauszeigers verbessern möchten, verwenden Sie Freeware WinMouse. Es fügt weitere Funktionen hinzu, damit Sie das...
Linker Mausklick funktioniert nicht unter Windows 10
Wenn Sie eine dedizierte Maus mit Ihrem Laptop oder Desktop-Computer verwenden, aber die linker Mausklick funktioniert nicht unter Windows 10/8/7 aus ...