Heim  >  Artikel  >  Betrieb und Instandhaltung  >  So veranlassen Sie Crontab, jede Sekunde eine Aufgabe auszuführen

So veranlassen Sie Crontab, jede Sekunde eine Aufgabe auszuführen

coldplay.xixi
coldplay.xixiOriginal
2020-07-06 16:29:017328Durchsuche

So veranlassen Sie Crontab, jede Sekunde eine Aufgabe auszuführen

So veranlassen Sie Crontab, jede Sekunde eine Aufgabe auszuführen

Crontab ist eine geplante Planungskonfigurationsdatei unter Linux. Dadurch können wir Systemprogramme, Skripte, Befehle und Aufgaben zu festgelegten Zeiten ausführen , Intervall- und Taktbetrieb. Die kleinste Zeitgranularität in Crontab beträgt Minuten. Mit anderen Worten: Durch die Crontab-Konfiguration können wir die Zielaufgabe höchstens einmal pro Minute ausführen. Eine häufigere Ausführung ist nicht möglich und wir können nur andere Methoden verwenden.

Verwandte Lernempfehlungen: Linux-Video-Tutorial

Was sollten Sie beispielsweise tun, wenn ein Programm alle 30 Sekunden ausgeführt werden soll?

Es gibt immer noch Problemumgehungen. Eine Idee besteht darin, in Crontab zwei Konfigurationen hinzuzufügen, eine dient der normalen Planung und wird einmal pro Minute ausgeführt, die andere besteht darin, vor der Ausführung 30 Sekunden zu warten.

# Need these to run on 30-sec boundaries, keep commands in sync.
* * * * *              /path/to/executable param1 param2
* * * * * ( sleep 30 ; /path/to/executable param1 param2 )

Diese Methode fühlt sich etwas steif und seltsam an, aber sie funktioniert. Diese Methode kann tatsächlich in einer Zeile abgekürzt werden:

* * * * * /bin/bash -l -c "/path/to/executable; sleep 30 ; /path/to/executable"

Eine andere Methode ist die Verwendung des Befehls watch:

$ watch --interval .30 script_to_run_every_30_sec.sh

Watch ist jedoch ein Befehlszeilentool, das wir verwenden können nohup lässt es im Hintergrund laufen.

SystemD-Timer

Wenn das von uns verwendete Linux-System über SystemD verfügt, können wir den SystemD-Timer verwenden, um Programme jederzeit in einer Granularität zu planen, die theoretisch natürlich bis in die Nanosekundenebene reichen kann , Es ist irgendwie verrückt, das zu tun. Kurz gesagt, die Flexibilität bei der Aufgabenplanung ist viel höher als bei Cron – es besteht keine Notwendigkeit, lahme Lösungen wie

sleep zu verwenden.

Verglichen mit crontab, das die Konfiguration in einer Zeile abschließt, ist das Einrichten eines SystemD-Timers etwas komplizierter, aber um Planungsaufgaben mit einer Granularität kleiner als „pro Minute“ besser implementieren zu können, ist diese Methode einen Versuch wert.

Das Implementierungsprinzip des SystemD-Timers besteht einfach aus zwei Teilen: einem Systemdienst und einem SystemD-Timer. Der SystemD-Timer führt die Planung durch und Aufgaben werden in den Dienst geschrieben.

Hier ist ein einfaches Beispiel. Das Ziel besteht darin, dass der Systemlogger alle zehn Sekunden „Hello World“ ausgibt;

/etc/systemd/system/helloworld.service

[Unit]
Description=Say Hello
[Service]
ExecStart=/usr/bin/logger -i Hello World

/etc/systemd/system/helloworld.timer

[Unit]
Description=Say Hello every 10 seconds
[Timer]
OnBootSec=10
OnUnitActiveSec=10
AccuracySec=1ms
[Install]
WantedBy=timers.targethelloworld.timer里并没有声明service的名称,那它和service是如何关联的呢?没错,因为它们的名称相同,都是helloworld。

Wenn Sie möchten, dass das gesamte System diesen Timer verwendet, müssen diese beiden Dateien abgelegt werden

/etc/systemd/system. Wenn Sie es für einen bestimmten Benutzer verwenden möchten, platzieren Sie es in ~/.config/systemd/user. Wenn Sie möchten, dass dieser Timer sofort ausgeführt wird, müssen Sie den folgenden Befehl ausführen: Das Tag –now

in

systemctl enable --now helloworld.timer
bewirkt, dass der Timer sofort ausgeführt wird. Andernfalls wird der Vorgang erst nach einem Neustart des Systems oder nach der Anmeldung des Benutzers ausgelöst. Die Funktionen jedes Felds im Abschnitt

[Timer] sind wie folgt:

  • OnBootSec – Wie viele Sekunden nach dem System beginnt mit der Planung
  • OnUnitActiveSec – Das Zeitintervall für die wiederholte Planung verwandter Dienste. Es ist diese Konfigurationszeile, die die geplanten Aktionen wie Cronjobs bestimmt.
  • AccuracySec – Timer-Genauigkeit. Der Standardwert ist eine Minute, sehr ähnlich wie bei cron. Es kann erforderlich sein, dass sie höher ist, aber die erhöhte Präzision führt zu einem höheren Systemverbrauch und einem häufigeren Aufwecken der CPU. Die obige Konfiguration sagt 1ms, was offensichtlich keine kluge Entscheidung ist. Normalerweise können wir ihn auf 1 (1 Sekunde) einstellen, was für die Genauigkeitsanforderungen von Timern wie unserem mit einer Zeitgranularität von weniger als 1 Minute ausreicht. Aus diesem Grund werden wir feststellen, dass die Ausgabe der „Hello World“-Nachricht oft um etwa eine Sekunde verzögert ist, wenn das eigentliche Programm ausgeführt wird. Wenn Sie der Meinung sind, dass die Verzögerung von etwa dieser Sekunde kein Problem darstellt, sollten Sie sie wie folgt einstellen.
Sie werden feststellen, dass der SystemD-Timer und der Crontab-Timer nicht identisch sind – der Aufgabenplanungszeitraum ist nicht nach Jahr, Monat, Tag, Stunde und Minute festgelegt, sondern basiert auf unserem ersten time Es beginnt zum Zeitpunkt seiner Ausführung und fügt jedes Mal einen Zeitzyklus hinzu. Wenn uns die Zeitkonfigurationsmethode wie Crontab gefällt und der SystemD-Timer sie auch unterstützt, müssen wir

OnBootSec und OnUnitActiveSec entfernen und sie wie folgt durch OnCalendar ersetzen ist ein Beispiel:

OnCalendar=*-*-* *:*:00,10,20,30,40,50

Schließlich sind der SystemD-Timer und der Dienst standardmäßig mit demselben Namen verknüpft. Wenn Sie möchten, können Sie ihn auch im

[Timer] koppeln Angabe des Feldes Einheit.

Die oben genannten Methoden können alle geplante Aufgaben mit einer Granularität von weniger als einer Minute implementieren. Jedes hat seine Vorteile. SystemD-Timer sehen formeller, aber etwas komplexer aus. Obwohl die Crontab+

sleep-Methode umständlich ist, ist sie für einige kleine Aufgaben nicht ungeeignet.

Das obige ist der detaillierte Inhalt vonSo veranlassen Sie Crontab, jede Sekunde eine Aufgabe auszuführen. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn