staging.inyokaproject.org

crontab - Script mit sehr langer Laufzeit

Status: Ungelöst | Ubuntu-Version: Nicht spezifiziert
Antworten |

klra

Anmeldungsdatum:
23. Juli 2011

Beiträge: 160

Hallo,

das ist jetzt hier keine Ubuntu-spezifische Frage, eher eine für Linux-Server, und da auch kein Ubuntu. Aber crontab unterscheidet sich da ja nicht viel.

Habe ein Script im crontab mit @monthly, das eine Laufzeit von mehrererereren Tagen hat. Nun denke ich, was ist, wenn der Server (shared Host) mal neu gestartet wird? Das killt doch sicherlich mein Script und dann muss es warten, bis wieder @monthly ist. Im ungünstigsten Fall wird es kurz nach Start gekillt.

Fragen:

1.) Gibt es Möglichkeiten, das Script nach Server-Neustart an dem Punkt weiterlaufen zu lassen, an dem es gekillt wurde? (eher nicht, oder?)

2.) Ist es besser, das Script auf mehrerererere Tage aufzusplitten? (wäre möglich)

Oder ist beides eh unnötig, weil [deine Antwort].

Eine weitere nur obligatorische Frage ist, wie es sich mit Zeitüberschneidungen bei von crontab gestarteten Scripts verhält. Kommt sich ein Script in die Quere, wenn es "zweimal" zur gleichen Zeit läuft? (also vom Script her kein Thema).

OFFTOPIC: dass das Forum keinen einfachen Zeilenumbruch gebacken kriegt, ist auch so ein Thema...

Moderiert von rklm:

Version entfernt

apt-ghetto

Anmeldungsdatum:
3. Juni 2014

Beiträge: 2943

klra schrieb:

das ist jetzt hier keine Ubuntu-spezifische Frage, eher eine für Linux-Server, und da auch kein Ubuntu. Aber crontab unterscheidet sich da ja nicht viel.

Und wieso gibst du dann eine falsche Version an? Nutzt dein Server auch systemd? Oder ein anderes Init-System?

Fragen:

Eigentlich gilt hier eine Frage pro Diskussion.

1.) Gibt es Möglichkeiten, das Script nach Server-Neustart an dem Punkt weiterlaufen zu lassen, an dem es gekillt wurde? (eher nicht, oder?)

Wenn du weisst, an welcher Stelle das Skript abgebrochen wurde, respektive was zuletzt erfolgreich ausgeführt wurde, dann wahrscheinlich schon.

2.) Ist es besser, das Script auf mehrerererere Tage aufzusplitten? (wäre möglich)

Welche Vorteile hat es, wenn du alles am Stück ausführst? Welche Vorteile hat es, wenn du dein Skript aufteilst? Gibt es Nachteile? Das müsstest du wissen respektive analysieren.

Eine weitere nur obligatorische Frage ist, wie es sich mit Zeitüberschneidungen bei von crontab gestarteten Scripts verhält. Kommt sich ein Script in die Quere, wenn es "zweimal" zur gleichen Zeit läuft? (also vom Script her kein Thema).

Wenn diese Frage "nur obligatorisch" ist, dann muss ich wohl nur darauf antworten: Kommt ganz auf das Skript an. Beispielsweise will man bei der Paketverwaltung nicht, dass zwei Prozesse gleichzeitig Pakete aktualisieren. Wenn zwei Prozesse nur lesend auf eine Datei zugreifen, kommen sich die Prozesse eher weniger in die Quere.

OFFTOPIC: dass das Forum keinen einfachen Zeilenumbruch gebacken kriegt, ist auch so ein Thema...

Das liegt daran, dass man sich dafür entschieden hat, dass zweimal Enter einen neuen Absatz generieren. Da die Browsergrösse der Forenteilnehmer zum Teil massiv divergiert, überlässt man dem Browser die Arbeit, den Text auf die Zeilen aufzuteilen.
Sehr kurze Zeile!
Aber eigentlich kriegst du es nicht gebacken, einen einfachen Zeilenumbruch zu generieren ⇒ Hilfe zur Syntax

klra

(Themenstarter)

Anmeldungsdatum:
23. Juli 2011

Beiträge: 160

Ha! einmal alles richtig machen in diesem Forum krieg ich sowieso nie hin.

Keine Ahnung ob der Server systemd nutzt, oder ein anderes Init-System.

Dann werd ich wohl das Script aufteilen müssen. Das Script in einem Stück laufen lassen ist halt sowas wie aus einem Guss, aber wenn der Guss breakt, hat man ja auch nichts erreicht. Dann halt Frickelarbeit.
Funktioniert sowas auch: "* * */20 * *" (alle 20 Tage) ?

Die obligatorische Frage hat sich erledigt, da ich vergessen hatte einen Testlauf zu killen und das Script nun zweimal gleichzeitig läuft. Welcher Prozess von den beiden gekillt werden könnte ist die große Frage, da ich in top kein eindeutiges Unterscheidungsmerkmal erkenne.

Wegen dem Offtopic
dazu habe ich eeeextra die Suche mit "zeilenumbruch forum ubuntuusers" bedient, aber da kommt nur anderer Kram.

Marc_BlackJack_Rintsch Team-Icon

Ehemalige
Avatar von Marc_BlackJack_Rintsch

Anmeldungsdatum:
16. Juni 2006

Beiträge: 4735

@klra:

Ad 1.): Das kommt ganz auf das Skript an. Automagisch geht das nicht, dazu müsste man es so schreiben, dass es beim Start erkennen kann, dass beim letzten Lauf mitten drin abgebrochen wurde und bei welchem Arbeitsschritt es gerade war, damit es die vorherigen überspringen kann. Dazu müsste man beispielsweise den aktuellen Schritt und eventuell noch mehr dafür wichtige Zustandsdaten persistent speichern. Und die einzelnen Schritte müssen so gestaltet sein, dass man sie neu starten kann, ohne dass sich dadurch ein Unterschied im Ergebnis/Effekt ergibt.

Damit kann man dann auch gleich die obligatorische Frage mit erschlagen: Wenn man sich persistent merkt bei welchem Schritt mit welchem Zustand das Skript gerade beschäftigt ist oder war, dann kann man auch einfach verhindern, dass das Skript mehrfach läuft. Dazu prüft das Skript am Anfang einfach ob ein Schritt und eine PID gespeichert ist und ob es selbst unter dieser PID schon einmal läuft. Falls ja, wurde bei laufendem Skript versucht es noch einmal zu starten → Abbruch. Andernfalls wurde das Skript vorher im Lauf beim gespeicherten Schritt abgebrochen → dort weiter machen.

Ad 2.) Was soll das genau bringen? Dann kann Dir nicht mehr das gesamte Skript abgebrochen werden, Du kannst aber durch Abstürze oder Neustarts die Arbeit von einzelnen Tagen/Teilen verlieren, also wird nur ein Teil des ursprünglichen Skripts ausgeführt. Macht beispielsweise Probleme wenn ein späterer Teil auf Ergebnis/Effekt eines früheren Teils angewiesen ist. Das kann übrigens auch ohne Neustarts Probleme machen wenn ein Skript aus irgendwelchen Gründen länger als erwartet benötigt und der nächste Schritt gestartet wird bevor der Vorhergehende abgeschlossen ist.

Warum ist aufteilen Frickelarbeit? Und aufteilen muss nicht Quelltext auf mehrere Dateien aufteilen heissen, Du willst ja nur die Arbeit aufteilen. Das kann man auch mit einer Skript-Datei machen, welche man an verschiedenen Tagen mit verschiedenen Argumenten aufruft. Also statt einmal im Monat mach_was.sh, am Montag mach_was.sh schritt_a, am Dienstag mach_was.sh schritt_b, und so weiter.

sebix Team-Icon

Ehemalige

Anmeldungsdatum:
14. April 2009

Beiträge: 5584

klra schrieb:

Keine Ahnung ob der Server systemd nutzt, oder ein anderes Init-System.

Dann wuerde ich ganz dringend den Server ruhend stellen und inzwischen beginnen, die Grundlagen zu lernen. Server sind kein Spielzeug.

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 13242

klra schrieb:

Habe ein Script im crontab mit @monthly, das eine Laufzeit von mehrererereren Tagen hat.

Man könnte das mit anacron anstatt cron machen. Dann wird es auf jeden Fall noch mal ausgeführt, wenn es nicht durchgelaufen ist.

Je nachdem, was Dein Skript macht, kann man es auch so schreiben, dass mehrere Starts egal sind (z.B. wenn man mit rsync oder cp etwas irgendwohin sicher. Die kann man beide so laufen lassen, dass sie nur die neuen oder fehlenden Dateien kopieren. Da gibt es tausend Möglichkeiten. Wenn es so lange dauert, weil so viele Dateien verarbeitet werden müssen, dann kann man sich ja auch den Zustand der Verarbeitung merken (also, welche Dateien bereits verarbeitet wurden). Die Frage allgemein zu beantworten ist schwierig.

klra

(Themenstarter)

Anmeldungsdatum:
23. Juli 2011

Beiträge: 160

Marc_BlackJack_Rintsch schrieb:

@klra: Das kann man auch mit einer Skript-Datei machen, welche man an verschiedenen Tagen mit verschiedenen Argumenten aufruft. Also statt einmal im Monat mach_was.sh, am Montag mach_was.sh schritt_a, am Dienstag mach_was.sh schritt_b, und so weiter.

So habe ich es bei den weiteren Scripts dann auch gemacht. läuft.

Das erste lief komplett durch, bis vor wenigen Tagen. Glück gehabt.

Antworten |