staging.inyokaproject.org

Was passiert mit Cronjobs beim ausschalten?

Status: Ungelöst | Ubuntu-Version: Xubuntu 16.10 (Yakkety Yak)
Antworten |

andi21

Anmeldungsdatum:
24. August 2010

Beiträge: 13

Hallo Zusammen,

ich eine grundlegende Frage. Ich habe ein einfaches Backup-Skript in /etc/cron.weekly/. Ein Mal pro Woche wird es gestartet, dann packt das Skript mit tar ein Archiv. Das dauert natürlich seine Zeit.

Ich denke so ca. 30 bis 40 Minuten. Was passiert wenn der Rechner in dieser Zeit ausgeschaltet wird?

Ist das Archiv dann einfach unvollständig?

Ist es überhaupt zu verwenden?

Und was mich vor allem interessiert: Merkt das System, dass etwas schief gelaufen ist und startet den Cronjob beim nächsten Start des Rechners noch mal?

Oder muss erst eine weitere Woche vergehen?

Vielen Dank für eure Hilfe.

ChickenLipsRfun2eat Team-Icon

Anmeldungsdatum:
6. Dezember 2009

Beiträge: 12067

Hallo!

Was genau macht denn dein Script? Also rsync beispielsweise kann die Arbeit wiederaufnehmen, bzw. nur die nicht aktuellen Dateien übertragen. Von "alleine" passiert das aber nicht.

Schaltest du den Rechner aus, wird das Script beendet und dein Backup ist unvollständig und nach einer Woche wird erneut angefangen.

Vorschlag: Du startest dein Script täglich und überprüfst einen von dir angelegten Status der letzten Ausführung (Datum, teilweise, vollständig,...). Ist es nicht komplett lässt du es laufen, ansonsten beendest du es einfach.

cron führt einfach zu einem festgelegten Zeitpunkt eine Aktion aus. Egal ob erfolgreich oder nicht.

frostschutz

Avatar von frostschutz

Anmeldungsdatum:
18. November 2010

Beiträge: 7795

Da vergeht eine weitere Woche... wenn du das anders haben willst musst du ein Script schreiben das z.B. täglich ausgeführt wird und selber prüft, ob es innerhalb der letzten Woche schon mal erfolgreich gelaufen ist und dann abbricht.

Erfolg/Misserfolg ist Cron allgemein ziemlich egal.

noisefloor Team-Icon

Anmeldungsdatum:
6. Juni 2006

Beiträge: 29567

Hallo,

Ich denke so ca. 30 bis 40 Minuten. Was passiert wenn der Rechner in dieser Zeit ausgeschaltet wird?

Wenn der Rechner runter gefahren wird, bekommen alle laufenden Prozesse ein Signal, dass sie auffordert, sich zu beenden. Was die Desktopumgebung, der NetworkManager etc. auch machen. Wenn dein Skript sich nicht freiwillige beendet, wird es in der Regel irgendwann zwangsbeendet. Inkl. aller Konsequenzen wie z.B. ein nicht brauchbares Archiv.

Also solltest du es machen wie von frostschutz beschrieben - oder tunlichst darauf achten, dass der Rechner nicht runter gefahren wird, wenn die Sicherung läuft. Es besteht ja auch die Möglichkeit, dass der Rechner automatisch runter gefahren wird, wenn das Backup-Skript fertig ist.

Gruß, noisefloor

frostschutz

Avatar von frostschutz

Anmeldungsdatum:
18. November 2010

Beiträge: 7795

noisefloor schrieb:

Also solltest du es machen wie von frostschutz beschrieben

ChickenLips hat ja ganz das gleiche beschrieben, das habe ich gar nicht gesehen, vielleicht war der Tab schon länger offen. 😉

Systemd hat glaube ich irgendwas das den Shutdown verhindern kann (systemd-inhibit?). z.B. solange ein kritisches Systemupdate läuft. Ob man das wegen so einem Script jetzt ansetzen möchte...

Dakuan

Avatar von Dakuan

Anmeldungsdatum:
2. November 2004

Beiträge: 6532

Wenn der Rechner runter gefahren wird, bekommen alle laufenden Prozesse ein Signal, dass sie auffordert, sich zu beenden.

Ganz so einfach ist die Sache leider nicht. Beim herunterfahren wird für die Prozesse ein SIGKILL generiert. Diesen bekommt der Prozess jedoch nie zu sehen, er wird ohne Rückfrage beendet (leider).

Programme, die sich nicht bedingungslos abwürgen lassen wollen, müssen da früher ansetzen. Mir ist das noch nicht gelungen. Was ich damit sagen will ist, das viele einfache Programme oder Scripte einfach so, während der Arbeit abgeschossen werden und davon nichts mit kriegen.

seahawk1986

Anmeldungsdatum:
27. Oktober 2006

Beiträge: 11278

Dakuan schrieb:

Wenn der Rechner runter gefahren wird, bekommen alle laufenden Prozesse ein Signal, dass sie auffordert, sich zu beenden.

Ganz so einfach ist die Sache leider nicht. Beim herunterfahren wird für die Prozesse ein SIGKILL generiert. Diesen bekommt der Prozess jedoch nie zu sehen, er wird ohne Rückfrage beendet (leider).

Daher würde ich sowas bevorzugt in eine Systemd-Unit packen und über systemd.timer statt cron periodisch ausführen lassen - dann ist ein sanfter Shutdown mittels frei wählbarem Signal garantiert und für Abläufe, die nicht unterbrochen werden sollen, kann man systemd-inhibit nutzen, solange der Nutzer der den Inhibitor setzt nicht mit dem Nutzer übereinstimmt, der den Shutdown auslösen will.

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 13242

Dakuan schrieb:

Wenn der Rechner runter gefahren wird, bekommen alle laufenden Prozesse ein Signal, dass sie auffordert, sich zu beenden.

Ganz so einfach ist die Sache leider nicht. Beim herunterfahren wird für die Prozesse ein SIGKILL generiert. Diesen bekommt der Prozess jedoch nie zu sehen, er wird ohne Rückfrage beendet (leider).

Wenn ich das recht erinnere, ist das aber nur die letzte Maßnahme - vorher wird eigentlich ein anders Signal geschickt (SIGTERM?), das der Prozess sehr wohl abfangen und darauf reagieren kann. Eine mögliche Reaktion wäre, vor dem Abbrechen einen Marker irgendwo hin zu schreiben, der dann beim nächsten Boot dahingehend ausgewertet wird, dass das Backup noch einmal ausgeführt wird. Man könnte z.B. ein minimales Skript unter /etc/rc5.d ablegen, das einmalig ein Backup ausführt und bei Erfolg anschließend sich selbst löscht.

Programme, die sich nicht bedingungslos abwürgen lassen wollen, müssen da früher ansetzen. Mir ist das noch nicht gelungen. Was ich damit sagen will ist, das viele einfache Programme oder Scripte einfach so, während der Arbeit abgeschossen werden und davon nichts mit kriegen.

Da wir ja jetzt Systemd haben, das auch zeitgesteuerte Aktionen unterstützt, könnte man das Problem ggf. damit erschlagen, wenn man die Task so definiert, dass Systemd sie auf jeden Fall beenden lässt bevor der Rechner komplett herunter gefahren wird. Da kenne ich mich aber zu wenig aus.

Edit: genau das, was seahawk1986 schrieb. Sorry, hatte ich übersehen. ☺

Dakuan

Avatar von Dakuan

Anmeldungsdatum:
2. November 2004

Beiträge: 6532

Wenn ich das recht erinnere, ist das aber nur die letzte Maßnahme - vorher wird eigentlich ein anders Signal geschickt (SIGTERM?), das der Prozess sehr wohl abfangen und darauf reagieren kann.

Ich hatte das seinerzeit auf einem Gnome System ausprobiert und dabei keine anderen Signale gesehen (habe sie mir anzeigen lassen). Auf ein SIGTERM reagiert mein Programm mit einer Sicherheitsabfrage, falls ungesicherte Daten vorliegen.

Ich erinnere mich nicht mehr genau, aber ich meine mich zu erinnern, das da vor dem eigentlichen herunterfahren irgendetwas mit D-Bus läuft. Ich hatte da aber nicht weiter nachgeforscht.

seahawk1986

Anmeldungsdatum:
27. Oktober 2006

Beiträge: 11278

Dakuan schrieb:

Ich erinnere mich nicht mehr genau, aber ich meine mich zu erinnern, das da vor dem eigentlichen herunterfahren irgendetwas mit D-Bus läuft. Ich hatte da aber nicht weiter nachgeforscht.

Die Situation ist in dem Fall auch etwas anders als bei einem Cronjob, der unabhängig von einer Desktop-Session läuft - in dem Fall kannst du den Inhibit-Mechanismus der Gnome-Session nutzen (das funktioniert in der Tat über DBus): https://people.gnome.org/~mccann/gnome-session/docs/gnome-session.html#org.gnome.SessionManager.Inhibit - es kommt halt darauf an, was man genau inhibieren möchte, wenn dazu so Sachen wie Logout oder Starten des Bildschirmschoner gehören, dann macht es für GUI-Programme Sinn, das zu verwenden (vgl. auch letzter Absatz von https://www.freedesktop.org/wiki/Software/systemd/inhibit/).

Antworten |