ubuntuusers.de

Crontab per bash Skript de/aktivieren

Status: Gelöst | Ubuntu-Version: Server 22.04 (Jammy Jellyfish)
Antworten |

ImmerAufDieKleinen

Avatar von ImmerAufDieKleinen

Anmeldungsdatum:
4. Juli 2019

Beiträge: Zähle...

Hallo.

Ich habe für die Verwaltung zweier Minecraft-Server ein Verwaltungs-Skript das z.B. Nachts die Server herunterfährt, ein Backup macht und danach wieder startet. Das läuft per crontab ohne Probleme.

Es gibt aber immer mal wieder Situationen wo ich einen Server außerplanmäßig warten muss (neue Plugins installieren, config ändern, neue Serverversion aktivieren, etc.), dazu kommentiere ich in der crontab die Zeilen für den betreffenden Server aus (hauptsächlich die Zeilen wo minütlich der Serverstatus geprüft wird, also wenn einer nicht läuft, wird er versucht zu starten) und fahre ihn dann manuell runter. Auch für einen Server-Restore nach einem crash der die Daten geschreddert hat, wäre die Funktion hilfreich.

Ich habe mir deshalb die Hilfe hier durchgelesen. Meine Idee ist nun die crontab der beiden Server zu trennen und in 2 separaten Dateien unter /etc/cron.d/ abzulegen. Für eine Deaktivierung lösche ich die entsprechende Datei und für die Aktivierung kopiere ich sie wieder (von einem anderen Verzeichnis) hinein. Soweit die Theorie.

Da ich noch nicht mit der Umsetzung begonnen habe, klappt das überhautp wie ich mir das vorstelle oder gibt es andere Ansätze wie man crontab-Einträge temporär deaktivieren kann?

Danke für den Input!

Thomas_Do Team-Icon

Moderator
Avatar von Thomas_Do

Anmeldungsdatum:
24. November 2009

Beiträge: 8808

Du kannst per Crontab einfach auf Skripte verweisen. Darin erstellst Du dann die entsprechenden Befehle. Die Skripte kannst Du direkt deaktivieren oder ändern. Möglich ist auch eine Anweisung einzubauen, die beispielsweise den Inhalt einer Datei abfragt (true/false).

seahawk1986

Anmeldungsdatum:
27. Oktober 2006

Beiträge: 11260

Wohnort: München

Du könntest dir auch mal Systemd/Timer Units als Ersatz für Cron ansehen - die lassen sich einfach bei Bedarf (de)aktivieren und man bekommt die Prozesskontrolle, die Systemd-Units bieten, auch gleich noch dazu.

kB Team-Icon

Supporter, Wikiteam
Avatar von kB

Anmeldungsdatum:
4. Oktober 2007

Beiträge: 9702

Wohnort: Münster

ImmerAufDieKleinen schrieb:

[…] Meine Idee ist nun die crontab der beiden Server zu trennen und in 2 separaten Dateien unter /etc/cron.d/ abzulegen. Für eine Deaktivierung lösche ich die entsprechende Datei und für die Aktivierung kopiere ich sie wieder (von einem anderen Verzeichnis) hinein. Soweit die Theorie.

Umständlich, aber möglich.

Da ich noch nicht mit der Umsetzung begonnen habe, klappt das überhautp wie ich mir das vorstelle

Ja. Etliche Pakete benutzen diese Option zur Einbringung ihrer Konfigurationsschnipsel in das Cron-System. Man kann das natürlich auch selbst benutzen, aber es ist nicht dafür vorgesehen.

oder gibt es andere Ansätze wie man crontab-Einträge temporär deaktivieren kann?

Die gängige Methode fragt auf Existenz einer Datei ab und startet den Befehl aus der Crontab abhängig vom Ergebnis dieses Test. Dazu finden sich in den installierten Crontabs etliche Beispiele. Bei dieser Methode ändert man nach Einrichtung nichts mehr an den Crontabs, sondern nur an der Steuerdatei.

Eine modernere Methode als Crontabs bieten die bereits genannten Systemd-Timer-Units.

ImmerAufDieKleinen

(Themenstarter)
Avatar von ImmerAufDieKleinen

Anmeldungsdatum:
4. Juli 2019

Beiträge: 42

seahawk1986 schrieb:

Du könntest dir auch mal Systemd/Timer Units als Ersatz für Cron ansehen

Danke, bin mal über die Doku geflogen und das sieht tatsächlich gut aus. Ich denke ich werde das trennen. Die nächtlichen Routineaufgaben (runterfahren > backup > hochfahren) belasse ich in der crontab. Den "Server-Healthcheck" muss ich aber deaktivieren können, das wird dann eine Timer-Unit.

Ich werde mich nach den Feiertagen mal damit beschäftigen und berichte wenn ich es (erfolgreich) implementiert habe.

ImmerAufDieKleinen

(Themenstarter)
Avatar von ImmerAufDieKleinen

Anmeldungsdatum:
4. Juli 2019

Beiträge: 42

So, ich hab das jetzt umgebaut und mit timer units klappt das auch prima. Ein kleiner Nachteil bleibt leider. Der Server-Neustart wird jetzt nicht mehr in der Skriptlog-Datei vermerkt. Das war bisher immer hilfreich weil damit z.B. ein Server-Crash schneller aufgefallen ist.

[2023-12-10 14:08:01] [check] server not running - trying to restart

Das ist aber verschmerzbar. Muss ich mich eben auf das Logverzeichnis der Minecraft-Server konzentrieren. Da wird bei jedem Neustart eine neue Logdatei angelegt.

Mein Problem ist damit gelöst. Danke nochmal an alle für die Hilfestellung.

noisefloor Team-Icon

Anmeldungsdatum:
6. Juni 2006

Beiträge: 29567

Hallo,

Der Server-Neustart wird jetzt nicht mehr in der Skriptlog-Datei vermerkt.

Die Timer Unit führt doch eine Service Unit aus. Service Units kennen direktiven zum automatischen Neustart des Dienstes, wenn dieser Crash. Die Direktive heißt "Restart=". Das Logging für Units erfolgt standardmäßig ins zentral Journal von systemd, siehe journald. Abfragen kannst du Journal über journalctl. Damit kannst du auch gezielt nach Logeinträgen deiner Unit suchen.

Gruß, noisefloor

ImmerAufDieKleinen

(Themenstarter)
Avatar von ImmerAufDieKleinen

Anmeldungsdatum:
4. Juli 2019

Beiträge: 42

noisefloor schrieb:

Hallo,

Der Server-Neustart wird jetzt nicht mehr in der Skriptlog-Datei vermerkt.

Das Logging für Units erfolgt standardmäßig ins zentral Journal von systemd, siehe journald.

Ja das ist natürlich korrekt. Mir ging es aber darum dass ich nicht mehr alle Log-Einträge in einer Datei und in einem Format gesammelt habe. Das ist natürlich ein Komfort-Problem, kein technisches - und deshalb halte ich es aktuell nicht für verfolgenswert.

noisefloor Team-Icon

Anmeldungsdatum:
6. Juni 2006

Beiträge: 29567

Hallo,

Mir ging es aber darum dass ich nicht mehr alle Log-Einträge in einer Datei und in einem Format gesammelt habe.

Prinzipiell könntest du auch dein Skript ins Journal von systemd loggen lassen. Oder du schreibst dir ein 2. Skript, was die für dich relevanten Logeinträge aus dem Journal zieht und in deine Logdatei schreibst. Ob das für dich sinnvoll ist bzw. die Nutzen-Aufwand-Rechnung aufgeht muss du selber für dich entscheiden.

Gruß, noisefloor

Antworten |