Beiträge von Igel1954

    Mir ist jetzt in den letzten Tag noch etwas negatives zu gestoßen. Nach einem, durch einen Patch erzwungenen, Neustart wurden meine 3 systemd-timer nicht sauber wieder aktiv gesetzt. Vermutlich ist hier systemd etwas zu früh, weil meine systemd-timer und -services ja in /usr/local/lib/systemd/system liegen.


    Ich musste sie manuell wieder aktivieren.


    Jetzt versuche ich durch Tests herauszufinden, weleche Angaben im Bereich [Init] zusätzlich notwendig sind, um das aktivieren der Timer zu verzögern.


    Ich hab bisher nur die folgenden targets iin [Init] angegeben:


    Code
    [Unit]
    Wants=network-online.target local-fs.target

    Ich muss jetzt erstmal schauen, welche Targets ich an dieser Stelle noch als Sync-Point angeben muss/kann.

    Ich hab meine 3 regelmäßigen Aufgaben jetzt ein paar Tage schon via systemd laufen.


    Da der vorhandene Inhalt der Dateien, in die ich meine Protokollausgaben schreibe, beim öffnen nicht gelöscht (truncated) sondern nur überschrieben wird, wollte ich variable Dateinamen verwenden. Das ist aber leider von systemd nicht vorgesehen. Man kann bei StandardOutput etc. keine Shellvariablen im Dateinamen verwenden. Die Fehlermeldung taucht aber erst bei der Ausführung der Service-Unit im Journal auf und die Unit wird nicht ausgeführt.


    Ich suche zur Zeit noch nach einer Möglichkeit, entweder meine Protokolldateien Dateien beim Start der Unit zu leeren bzw. zu löschen. Da experimentiere ich noch.


    Ich hab aber nach mehrmaligem Lesen der Man-page systemd.units meine selbsterstellten Unit-Files nicht mehr in /etc/systemd/system liegen, sondern in /usr/local/lib/systemd/system. Das hat bei mir sogar den Vorteil, dass ich /usr/local auf der 2. Platte in einer separaten Partition liegen habe und diese bei einem Upgrade meines Systems nicht angepackt wird.


    Da meine Scripte, die ich über systemd ausführen lasse, ja in /usr/local/bin liegen, ist jetzt alles was zusammengehört am gleichen Ort (Partition/Filesystem).


    Man kann sich die Pfade, die von systemd im --system Mode bzw im --user Mode durchsucht werden, anzeigen lassen:


    Pfade im --system Mode

    Pfade im --user mode:

    Noch eine Besonderheit bei dem Service hab ich vergessen zu erwähnen.

    Man kann in einem Service mehrere ExecStart-Anweisungen einsetzen, die alle sequentiell abgearbeitet werden. Nur hat das einen kleinen Nachteil, wenn man die Ausgaben der einzelnen Programme/Scripte nach  StandardOutput=file:/pfad/datei schreiben lässt. Jede ExecStart-Anweisung überschreibt die vorherige Ausgabe. Will man alle Ausgaben der einelnen ExecStart-Anweisungen erhalten, muss man hier mit StandardOutput=append:/pfad/datei arbeiten und evtl. den erzeugten File später händisch bereinigen.


    Ich hatte bei meinem Sonntags-Service zuerst beide Backups in einem Service abhandeln wollen und dabei dann feststellen müssen, dass mein erzeugtes Log-File nur die Ausgaben der letzten ExecStart-Anweisung enthielt. Ich hab mir dann noch mal in den Man-Pages die OnCalender_Möglichkeiten angesehen und dabei dann auch gesehen, dass diese Angabe mehrfach in einem Timer auftreten darf.


    Wie man Status seiner Timer und Services überprüfen kann, beschreibe ich mit dem folgenden Beispiel.


    Mit systemctl status <name>.timer läßt sich prüfen, ober der Timer aktiv ist und auf die nächste Ausführung wartet. Er zeigt auch an, wie der getriggerte Service heißt.


    systemctl status <name>.service zeigt, ob der Service geladen ist, seit wann er inactive ist und von wem er getriggert wird und ob die letzte Ausführung fehlerfrei war.


    Ich habe mittlerweile auch meine beiden Sicherungen nach systemd überführt.


    Die laufen bei z. B. zu folgenden Zeiten:


    Montags, Mittwochs und Freitags erfolgt ein Backup mit BorgBackup gegen 7:00, nachdem mein Update-Script ausgeführt worden ist, es werden dabei 3 Sicherungsarchiver (igel01-system-<datetime>, igel01-home-<datetime> und igel01-server-<datetime> erstellt.


    Am Sonntag um 00:00:00 Uhr mache ich eine Filesystem-Backup mit fsarchiver für die Filesysteme, die /home, /public, /srv und /VM beinhalten. Zusätzlich mache ich um 9:00 dann noch zusätzlich ein komplettes Backup mit BorgBackup (wie Mo,Mi,Fri)


    Für die selbe Aufgabe, die z. B. an unterschiedlichen Tagen und vielleicht sogar dabei auch zu unterschiedlichen Uhrzeiten, ausgeführt werden soll, benötigt man bei Cron mehrere Einträge. Bei systemd reicht ein Timer-File und das dazugehörige Service-File:


    Code: systemd.timer
    [Timer]
    OnCalendar=Mon,Wed,Fri *-*-* 07:00:00
    OnCalendar=Sun *-*-* 09:00:00

    Der OnCalender-Eintrag kann beliebig oft auftreten. Man kann hier für jeden Wochentag, Datum, Uhrzeit unterschiedliche Kombinationen erstellen. Beispiele finden sich in den Man-Pages zu systemd.timer(5).


    Für meine Sicherung per BorgBackup sieht das Timer-File so aus:


    Das dazugehörige Service-File sieht so aus:

    Der Install-Block kann Einsatz eines Timers wohl auch weggelassen werden. Da ich mir hier aber nicht ganz sicher bin, ist dieser Block halt in beiden Files vorhanden.


    Mit systemctl list-timers kann man kontrollieren, ob eine Timer-Aufgabe durchgeführt wurde und wann sie das nächste Mal wieder ausgeführt wird.


    Das sieht dann in etwa so aus:

    Für alle, die sich auch für systemd anstelle von cron für die regelmäßige Ausführung bestimmter Aufgaben interessieren, kommt hier noch ein wichtiger Hinweis.


    Unter openSuSE LEAP 15.3 werkelt systemd 246. Die Man-Pages zu systemd auf Freedesktop.org (z. B. : http://www.freedesktop.org/sof…md/man/systemd.timer.html) beziehen sich schon auf systemd 251. Hier gibt es einige Angaben, die unter systemd 246 zu einer Fehlermeldung führen. Ich bin da nämlich bei den möglichen Angaben für StandardOutput auf eine Fehlermeldung gelaufen:

    /etc/systemd/system/Update_OS.service:13: Failed to parse output specifier, ignoring: truncate:/var/log/Update_OS.log


    Beispiel:

    systemd 246: kennt nur StandardOutput = file:/pfad/datei oder StandardOutput = append:/pfad/datei..

    systemd 251: kennt auch StandardOutput= truncate:/pfad/datei.

    Ich steuere das über die Zypper-Exitcodes.
    Hier mal der Ablauf meines Scriptes:


    1. zypper --gpg-auto-import-keys --non-interactive ref 
      geht hier etwas schief, schläft das Script für 1800 Sekunden. Nach dem 5. vergeblichen Refreshes wird das Script abgebrochen
    2. zypper -vvv pchk --with-optional
      gibt es Patches bekomme ich von Zypper den Exitcode 100 oder 101 gemeldet.
    3. Bei Exitcode 100 oder 101 zypper -vvv patch -y -l --with-optional --with-interactive
      Bei Exitcode 103 wurde zypper upgedatet und der Patch-Befehl wird nochmal abgesetzt.
      Hier bekomme ich entweder einen Exitcode = 0 dann ist alles ok, bei Exitcode 102 setzte ich einen Schalter, dass ein Reboot erforderlich ist.
      Man könnte dem Patch-Befehl noch --with-updates mitgeben, dann würden die Updates aus den anderen Repos direkt mit verarbeitet. Ich hab es für mich aber absichtlich getrennt, damit ich in dem Log eine getrennte Übersicht habe, welche Patches und welche Updates installiert wurden. Ist in meinen Augen übersichtlicher.
    4. Da Patches nur aus den OSS bzw. NON-OSS -Repos kommen, ich aber auch Packages aus dem Packman- Printing-, und Mozilla-Repo habe macht mein Script jetzt noch
      zypper -vvv up -y -l --details --with-interactive, damit ich hier die geänderten Packages bekomme.
    5. Bevor jetzt mein Script zur Endeverarbeitung kommt, setzte ich sicherheitshalber nach ein zypper needs-rebooting ab. Ist ein Reboot erforderlich, bekomme ich hier auch wieder den Exitcode 102 und kann den Reboot-Schalter auf True setzen.
    6. Da jetzt das Script in der Endeverarbeitung ist, wird hier der Reboot-Schalter abgefragt.
      Ist er gesetzt, dann erfolgt der Shutdown -r Befehl. Ich lasse den Shutdown 30 Minuten verzögern, damit mein Script ordnungsgemäß beendet wird. Die Verzögerungszeit ist von mir willkürlich gewählt. Man kann Shutdown auch auf eine bestimmte Uhrzeit setzen oder der verzögerungszeit verkürzen oder verlängern.

    Ich hab mir die Zypper-Exitcodes aus der Zypper-Doku in ein extra Textfile kopiert. Ich hänge es mal an meine Antwort mit an.


    Zypper_Returncodes.txt