<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Problembehebung Archives - yourdevice.ch - Deine Anlaufstelle für Linux, OpenSource Software und Co</title>
	<atom:link href="https://yourdevice.ch/tag/problembehebung/feed/" rel="self" type="application/rss+xml" />
	<link>https://yourdevice.ch/tag/problembehebung/</link>
	<description></description>
	<lastBuildDate>Wed, 02 Sep 2026 10:39:12 +0000</lastBuildDate>
	<language>de</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=7.1.3</generator>

<image>
	<url>https://yourdevice.ch/wp-content/uploads/2022/11/cropped-ydlogo-e1667602958877-32x32.png</url>
	<title>Problembehebung Archives - yourdevice.ch - Deine Anlaufstelle für Linux, OpenSource Software und Co</title>
	<link>https://yourdevice.ch/tag/problembehebung/</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>systemd-Timer statt Cronjob: einrichten und überwachen</title>
		<link>https://yourdevice.ch/systemd-timer-statt-cronjob/</link>
					<comments>https://yourdevice.ch/systemd-timer-statt-cronjob/#comments</comments>
		
		<dc:creator><![CDATA[Mario]]></dc:creator>
		<pubDate>Wed, 02 Sep 2026 10:39:08 +0000</pubDate>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[Anleitungen]]></category>
		<category><![CDATA[Backup]]></category>
		<category><![CDATA[Problembehebung]]></category>
		<category><![CDATA[selfhosting]]></category>
		<guid isPermaLink="false">https://yourdevice.ch/?p=22495</guid>

					<description><![CDATA[<p>systemd-Timer statt Cronjob: Service- und Timer-Unit anlegen, OnCalendar verstehen, Timer prüfen und bei Fehlern automatisch benachrichtigt werden.</p>
<p>The post <a href="https://yourdevice.ch/systemd-timer-statt-cronjob/">systemd-Timer statt Cronjob: einrichten und überwachen</a> appeared first on <a href="https://yourdevice.ch">yourdevice.ch - Deine Anlaufstelle für Linux, OpenSource Software und Co</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Ein Cronjob, der nicht mehr läuft, meldet sich nicht. Er verschwindet einfach aus eurem Leben, und ihr merkt es an dem Tag, an dem ihr die Sicherung braucht. Genau dieses Loch schliessen <strong>systemd-Timer</strong>: Sie bringen die geplante Aufgabe in dieselbe Verwaltung wie jeden anderen Dienst, mit Statusabfrage, Logbuch und – der eigentliche Gewinn – einem Alarm, wenn etwas schiefgeht. Diese Anleitung baut einen solchen Timer von Grund auf, erklärt die Zeitsyntax und hängt am Ende eine Push-Benachrichtigung dran.</p>



<figure class="wp-block-image size-large"><img fetchpriority="high" decoding="async" width="1024" height="573" src="https://yourdevice.ch/wp-content/uploads/2026/09/systemd-timer-statt-cronjob-titelbild-1024x573.png" alt="Dunkles Titelbild mit dem Schriftzug „systemd-Timer statt Cronjob&quot; und einem Terminalfenster darunter. Darin steht der Befehl systemctl list-timers backup-home.timer und seine Ausgabe mit den Spalten NEXT, LEFT, UNIT und ACTIVATES: Do 2026-09-03 02:14, 19h left, backup-home.timer, backup-home.service. Das Bild zeigt, dass ein systemd-Timer den nächsten Ausführungszeitpunkt und den zugehörigen Dienst jederzeit abfragbar macht." class="wp-image-22493" srcset="https://yourdevice.ch/wp-content/uploads/2026/09/systemd-timer-statt-cronjob-titelbild-1024x573.png 1024w, https://yourdevice.ch/wp-content/uploads/2026/09/systemd-timer-statt-cronjob-titelbild-300x168.png 300w, https://yourdevice.ch/wp-content/uploads/2026/09/systemd-timer-statt-cronjob-titelbild-768x430.png 768w, https://yourdevice.ch/wp-content/uploads/2026/09/systemd-timer-statt-cronjob-titelbild-1536x860.png 1536w, https://yourdevice.ch/wp-content/uploads/2026/09/systemd-timer-statt-cronjob-titelbild-500x280.png 500w, https://yourdevice.ch/wp-content/uploads/2026/09/systemd-timer-statt-cronjob-titelbild.png 1600w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>





<h2 class="wp-block-heading">Warum systemd-Timer den Cronjob ablösen</h2>



<p class="wp-block-paragraph">Cron macht genau eine Sache: Es startet zur eingetragenen Zeit einen Befehl. Was danach passiert, interessiert es nicht. Läuft der Befehl auf einen Fehler, landet die Ausgabe im besten Fall in einer lokalen Mail, die niemand liest, und im schlechteren Fall in <code>/dev/null</code>, weil das jemand vor drei Jahren so eingetragen hat, damit das Log nicht zuläuft. Wie diese Umleitung funktioniert, haben wir in <a href="https://yourdevice.ch/stdout-stderr-und-dev-null-die-wichtigsten-linux-datenstroeme-verstaendlich-erklaert/">stdout, stderr und /dev/null</a> auseinandergenommen – bei Cron ist sie der häufigste Grund, warum ein Fehlschlag unbemerkt bleibt.</p>



<p class="wp-block-paragraph">Falls ihr Cron bisher klassisch benutzt habt, etwa für die Hintergrundaufgaben einer Nextcloud, kennt ihr die Bedienung aus unserer Anleitung <a href="https://yourdevice.ch/cronjob-fuer-eure-nextcloud-erstellen/">Cronjob für Eure Nextcloud erstellen</a>. Alles, was dort steht, funktioniert weiterhin. Es gibt nur eben inzwischen einen zweiten Weg.</p>



<p class="wp-block-paragraph">Amazon ist dabei am deutlichsten geworden. In der Dokumentation zu Amazon Linux 2023 steht schwarz auf weiss: <em>„In AL2023, <code>cronie</code> is not included by default. Therefore, support for <code>crontab</code> is no longer provided by default."</em> Und weiter: <em>„We recommend that you migrate to <code>systemd</code> timers due to the added functionality provided by <code>systemd</code>."</em> Nachzulesen in der <a href="https://docs.aws.amazon.com/linux/al2023/ug/cron.html">AL2023-Dokumentation zu Cron</a>. Auf Debian, Ubuntu und Mint ist Cron weiterhin installiert – aber ein wachsender Teil der Systemwartung läuft dort ohnehin schon über Timer-Units, ohne dass es jemand gemerkt hätte.</p>



<p class="wp-block-paragraph">Der praktische Unterschied lässt sich in eine Tabelle packen:</p>



<figure class="wp-block-table"><table><thead><tr><th>Punkt</th><th>Cron</th><th>systemd-Timer</th></tr></thead><tbody><tr><td>Ausgabe und Fehler</td><td>Mail oder nirgendwo</td><td>immer im Journal, abfragbar mit <code>journalctl -u</code></td></tr><tr><td>Status abfragen</td><td>nicht vorgesehen</td><td><code>systemctl status</code>, <code>systemctl list-timers</code></td></tr><tr><td>Verpasster Termin</td><td>fällt aus, ausser mit anacron</td><td><code>Persistent=true</code> holt ihn nach</td></tr><tr><td>Alle Jobs gleichzeitig</td><td>Lastspitze zur vollen Stunde</td><td><code>RandomizedDelaySec=</code> verteilt sie</td></tr><tr><td>Fehler melden</td><td>selbst bauen</td><td><code>OnFailure=</code> startet eine beliebige Unit</td></tr><tr><td>Rechte, Limits, Isolation</td><td>über das Skript</td><td>über die Unit selbst</td></tr><tr><td>Syntax prüfen</td><td>Rätselraten</td><td><code>systemd-analyze calendar</code></td></tr><tr><td>Aufwand</td><td>eine Zeile</td><td>zwei Dateien</td></tr></tbody></table></figure>



<p class="wp-block-paragraph">Die letzte Zeile ist der ehrliche Teil. Wer alle fünf Minuten ein Einzeiler-Skript anstossen will und sonst nichts, ist mit Cron schneller fertig. Für alles, dessen Ausfall wehtut – Sicherungen, Zertifikatserneuerungen, Datenbankpflege – lohnt sich der Mehraufwand ab dem ersten stillen Fehlschlag.</p>



<h2 class="wp-block-heading">Voraussetzungen und eine Vorwarnung</h2>



<p class="wp-block-paragraph">Ihr braucht ein System mit systemd. Das trifft auf Debian, Ubuntu, Linux Mint, Fedora, openSUSE und Arch zu, also auf praktisch alles, was auf dieser Seite sonst behandelt wird. Prüfen lässt sich das mit:</p>



<pre class="wp-block-code"><code>systemctl --version</code></pre>



<p class="wp-block-paragraph">Für Units im Systemkontext braucht ihr Root-Rechte. Alle folgenden Befehle mit <code>sudo</code> setzen voraus, dass euer Benutzer das darf. Wer sich bei Benutzern, Gruppen und Rechten unsicher ist, findet die Grundlagen in <a href="https://yourdevice.ch/linux-gruppen-und-berechtigungen-einfach-erklaert/">Linux Gruppen und Berechtigungen einfach erklärt</a>.</p>



<p class="wp-block-paragraph"><strong>Wichtig:</strong> Legt eigene Units immer unter <code>/etc/systemd/system/</code> ab, niemals unter <code>/lib/systemd/system/</code> oder <code>/usr/lib/systemd/system/</code>. Das zweite Verzeichnis gehört der Paketverwaltung, und das nächste Update überschreibt eure Datei kommentarlos.</p>



<h2 class="wp-block-heading">Die zwei Dateien: eine Service-Unit und eine Timer-Unit</h2>



<p class="wp-block-paragraph">Ein systemd-Timer führt selbst nichts aus. Er ist ausschliesslich der Wecker; die Arbeit macht eine Service-Unit. Die Handbuchseite <a href="https://manpages.debian.org/testing/systemd/systemd.timer.5.en.html">systemd.timer(5)</a> beschreibt die Zuordnung so: Ein Timer namens <code>foo.timer</code> aktiviert standardmässig die Unit <code>foo.service</code>, also den gleichen Namen mit anderer Endung. Solange ihr beide Dateien gleich benennt, müsst ihr die Verbindung nirgends eintragen.</p>



<p class="wp-block-paragraph">Als durchgehendes Beispiel dient eine nächtliche Sicherung des Home-Verzeichnisses. Das eigentliche Skript liege unter <code>/usr/local/bin/backup-home.sh</code> und sei ausführbar.</p>



<h3 class="wp-block-heading">Schritt 1: Die Service-Unit anlegen</h3>



<pre class="wp-block-code"><code>sudo nano /etc/systemd/system/backup-home.service</code></pre>



<p class="wp-block-paragraph">Inhalt:</p>



<pre class="wp-block-code"><code>&#91;Unit]
Description=Naechtliche Sicherung des Home-Verzeichnisses
Wants=network-online.target
After=network-online.target

&#91;Service]
Type=oneshot
ExecStart=/usr/local/bin/backup-home.sh
User=mario
Nice=10
IOSchedulingClass=idle</code></pre>



<p class="wp-block-paragraph">Drei Zeilen verdienen eine Erklärung. <code>Type=oneshot</code> ist der Typ für Aufgaben, die anlaufen, ihre Arbeit tun und sich beenden. Laut <a href="https://manpages.debian.org/testing/systemd/systemd.service.5.en.html">systemd.service(5)</a> betrachtet der Dienstmanager die Unit erst dann als gestartet, wenn der Hauptprozess sich beendet hat – <em>„the service manager will consider the unit up after the main process exits"</em>. Genau das wollt ihr hier, denn eine Sicherung ist fertig oder nicht.</p>



<p class="wp-block-paragraph"><code>User=mario</code> lässt das Skript unter eurem Benutzer laufen statt als Root – ersetzt den Namen, und lasst die Zeile weg, falls das Skript Root braucht. <code>Nice=10</code> und <code>IOSchedulingClass=idle</code> drängen den Job hinter interaktive Arbeit zurück; die Sicherung darf zehn Minuten länger dauern, wenn dafür niemand ruckelt.</p>



<p class="wp-block-paragraph">Es fehlt eine Zeile, die ihr aus Cron kennt: die Umleitung der Ausgabe. Die braucht es nicht. Alles, was das Skript auf stdout und stderr schreibt, landet ohne Zutun im Journal – so beschreibt es <a href="https://manpages.debian.org/testing/systemd/systemd.exec.5.en.html">systemd.exec(5)</a> im Abschnitt zu Logging und Standard-Ein- und -Ausgabe.</p>



<h3 class="wp-block-heading">Schritt 2: Die Timer-Unit anlegen</h3>



<pre class="wp-block-code"><code>sudo nano /etc/systemd/system/backup-home.timer</code></pre>



<p class="wp-block-paragraph">Inhalt:</p>



<pre class="wp-block-code"><code>&#91;Unit]
Description=Startet die naechtliche Home-Sicherung

&#91;Timer]
OnCalendar=*-*-* 02:00:00
Persistent=true
RandomizedDelaySec=900
AccuracySec=1min

&#91;Install]
WantedBy=timers.target</code></pre>



<p class="wp-block-paragraph">Der Abschnitt <code>[Install]</code> mit <code>WantedBy=timers.target</code> ist der Grund, warum der Timer nach einem Neustart wieder da ist. Fehlt er, lässt sich die Unit zwar starten, aber nicht dauerhaft aktivieren.</p>



<h3 class="wp-block-heading">Schritt 3: Einlesen und aktivieren</h3>



<pre class="wp-block-code"><code>sudo systemctl daemon-reload
sudo systemctl enable --now backup-home.timer</code></pre>



<p class="wp-block-paragraph"><code>daemon-reload</code> lädt die Konfiguration des Dienstmanagers neu; laut <a href="https://manpages.debian.org/unstable/systemd/systemctl.1.en.html">systemctl(1)</a> werden dabei alle Unit-Dateien neu eingelesen und der gesamte Abhängigkeitsbaum neu aufgebaut. Ohne diesen Schritt kennt systemd eure Datei nicht. <code>enable --now</code> aktiviert die Unit und startet sie in einem Aufwasch.</p>



<p class="wp-block-paragraph">Beachtet: Aktiviert wird der <strong>Timer</strong>, nicht der Service. Der Service bleibt inaktiv und wird vom Timer geweckt. Ein häufiger Anfängerfehler ist <code>systemctl enable backup-home.service</code> – damit läuft die Sicherung bei jedem Systemstart genau einmal und danach nie wieder.</p>



<p class="wp-block-paragraph">Testen lässt sich der Ablauf jederzeit, ohne auf zwei Uhr nachts zu warten:</p>



<pre class="wp-block-code"><code>sudo systemctl start backup-home.service
systemctl status backup-home.service</code></pre>



<p class="wp-block-paragraph">Damit ist die Grundkonstruktion fertig. Wie die drei beteiligten Units zusammenspielen – die dritte kommt weiter unten dazu – zeigt das folgende Schaubild.</p>



<figure class="wp-block-image size-large"><img decoding="async" width="1024" height="525" src="https://yourdevice.ch/wp-content/uploads/2026/09/systemd-timer-unitkette-1024x525.png" alt="Schaubild mit drei Karten nebeneinander. Links backup-home.timer als Wecker mit den Einstellungen OnCalendar, Persistent und RandomizedDelaySec; ein Pfeil mit der Beschriftung „startet die Unit mit gleichem Namen&quot; führt zur mittleren Karte backup-home.service mit Type=oneshot und ExecStart, deren Ausgabe ins Journal geht; ein rot beschrifteter Pfeil „nur im Zustand failed, über OnFailure=&quot; führt zur rechten Karte alarm@.service, die eine Push-Nachricht verschickt. Die Grafik zeigt, dass nur der Timer aktiviert wird, der Dienst von ihm gestartet wird und die dritte Unit ausschliesslich bei einem Fehlschlag läuft." class="wp-image-22494" srcset="https://yourdevice.ch/wp-content/uploads/2026/09/systemd-timer-unitkette-1024x525.png 1024w, https://yourdevice.ch/wp-content/uploads/2026/09/systemd-timer-unitkette-300x154.png 300w, https://yourdevice.ch/wp-content/uploads/2026/09/systemd-timer-unitkette-768x394.png 768w, https://yourdevice.ch/wp-content/uploads/2026/09/systemd-timer-unitkette-1536x787.png 1536w, https://yourdevice.ch/wp-content/uploads/2026/09/systemd-timer-unitkette-2048x1050.png 2048w, https://yourdevice.ch/wp-content/uploads/2026/09/systemd-timer-unitkette-500x256.png 500w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<h2 class="wp-block-heading">OnCalendar: die Zeitsyntax, die kein Cron-Format ist</h2>



<p class="wp-block-paragraph">Hier liegt die grösste Umgewöhnung. <code>OnCalendar=</code> benutzt nicht die fünf Sternchen aus der Crontab, sondern eine eigene Schreibweise. Die Handbuchseite <a href="https://manpages.debian.org/testing/systemd/systemd.time.7.en.html">systemd.time(7)</a> beschreibt das Format als <em>Wochentag Jahr-Monat-Tag Stunde:Minute:Sekunde</em>. Der Wochentag darf fehlen, das Datum ebenso; die Uhrzeit ist der Kern.</p>



<p class="wp-block-paragraph">Die Operatoren sind schnell erzählt. Ein Sternchen passt auf jeden Wert. Mehrere Werte werden mit Komma aufgezählt. Zwei Punkte bilden einen Bereich, etwa <code>Mon..Fri</code>. Der Schrägstrich bedeutet Wiederholung, also <code>*:0/15</code> für alle fünfzehn Minuten.</p>



<p class="wp-block-paragraph">Zusätzlich gibt es Kurzformen, die die Handbuchseite ausdrücklich als Abkürzungen ausweist:</p>



<figure class="wp-block-table"><table><thead><tr><th>Kurzform</th><th>steht für</th></tr></thead><tbody><tr><td><code>minutely</code></td><td><code>*-*-* *:*:00</code></td></tr><tr><td><code>hourly</code></td><td><code>*-*-* *:00:00</code></td></tr><tr><td><code>daily</code></td><td><code>*-*-* 00:00:00</code></td></tr><tr><td><code>weekly</code></td><td><code>Mon *-*-* 00:00:00</code></td></tr><tr><td><code>monthly</code></td><td><code>*-*-01 00:00:00</code></td></tr><tr><td><code>quarterly</code></td><td><code>*-01,04,07,10-01 00:00:00</code></td></tr><tr><td><code>semiannually</code></td><td><code>*-01,07-01 00:00:00</code></td></tr><tr><td><code>yearly</code></td><td><code>*-01-01 00:00:00</code></td></tr></tbody></table></figure>



<p class="wp-block-paragraph">Ein paar praktische Ausdrücke, die die meisten Fälle abdecken:</p>



<pre class="wp-block-code"><code>OnCalendar=*-*-* 02:00:00          # jede Nacht um 02:00
OnCalendar=Mon..Fri *-*-* 07:30    # werktags um 07:30
OnCalendar=Sun *-*-* 04:00:00      # sonntags um 04:00
OnCalendar=*-*-01 03:00:00         # am Ersten jedes Monats um 03:00
OnCalendar=*:0/15                  # alle 15 Minuten
OnCalendar=hourly                  # zur vollen Stunde</code></pre>



<p class="wp-block-paragraph">Mehrere <code>OnCalendar=</code>-Zeilen in derselben Unit sind erlaubt und ergeben mehrere Auslösezeitpunkte. Eine leere Zuweisung <code>OnCalendar=</code> löscht alle bisherigen Angaben – nützlich in Drop-in-Dateien, verwirrend, wenn es unbeabsichtigt passiert.</p>



<h3 class="wp-block-heading">Den Ausdruck prüfen, bevor ihr ihn einsetzt</h3>



<p class="wp-block-paragraph">Ihr müsst nicht raten. <code>systemd-analyze</code> hat einen Unterbefehl, der genau dafür da ist. Die Handbuchseite <a href="https://manpages.debian.org/testing/systemd/systemd-analyze.1.en.html">systemd-analyze(1)</a> beschreibt ihn so: <em>„This command will parse and normalize repetitive calendar time events, and will calculate when they elapse next."</em></p>



<pre class="wp-block-code"><code>systemd-analyze calendar "Mon..Fri *-*-* 07:30"</code></pre>



<p class="wp-block-paragraph">Die Ausgabe nennt die ursprüngliche Form, die normalisierte Form, den nächsten Auslösezeitpunkt und den Abstand bis dahin. Steht dort ein Datum, das euch überrascht, habt ihr euch vertan – und das vor dem Produktivbetrieb statt danach. Verwandt und ebenso nützlich ist <code>systemd-analyze verify /etc/systemd/system/backup-home.service</code>: Der Befehl meldet unbekannte Abschnitte, fehlende Abhängigkeiten und nicht ausführbare Befehle.</p>



<p class="wp-block-paragraph">Kalenderausdrücke werden in der lokalen Zeitzone des Systems ausgewertet. Auf einem Server, der auf UTC steht, ist „02:00" also nicht eure Bettzeit – ein Blick auf <code>timedatectl</code> vor dem ersten Timer erspart Verwunderung.</p>



<h2 class="wp-block-heading">Persistent, RandomizedDelaySec und der Rest der Feineinstellung</h2>



<p class="wp-block-paragraph">Die vier Zeilen aus dem Beispiel sind der Punkt, an dem ein Timer den Cronjob inhaltlich überholt. Alle stammen aus dem Abschnitt <code>[Timer]</code> und sind in <a href="https://manpages.debian.org/testing/systemd/systemd.timer.5.en.html">systemd.timer(5)</a> beschrieben.</p>



<p class="wp-block-paragraph"><strong><code>Persistent=true</code></strong> speichert den letzten Auslösezeitpunkt auf der Platte. War das System zum geplanten Termin aus, wird der Job unmittelbar nach dem Hochfahren nachgeholt. Das ist die Funktion, für die es unter Cron ein zweites Programm braucht – anacron –, und auf einem Laptop, der nachts um zwei zugeklappt im Rucksack liegt, ist sie der Unterschied zwischen einer Sicherung und einer Sicherungsabsicht.</p>



<p class="wp-block-paragraph"><strong><code>RandomizedDelaySec=900</code></strong> verzögert die Ausführung um eine zufällig gewählte, gleichmässig verteilte Zeitspanne zwischen null und dem angegebenen Wert. Wenn zwanzig Maschinen um Punkt zwei Uhr dieselbe Netzwerkfreigabe ansteuern, verteilt das die Last über eine Viertelstunde. Wollt ihr die Verzögerung stabil statt bei jedem Start neu ausgewürfelt, setzt zusätzlich <code>FixedRandomDelay=true</code>: Der Versatz wird dann aus Maschinen-ID und Unit-Namen abgeleitet und bleibt gleich. Wie stark eure Maschine unter solchen Spitzen tatsächlich leidet, seht ihr mit den Werkzeugen aus <a href="https://yourdevice.ch/nuetzliche-linux-konsolen-tools-fuer-das-systemmonitoring/">Nützliche Linux Konsolen Tools für das Systemmonitoring</a>.</p>



<p class="wp-block-paragraph"><strong><code>AccuracySec=</code></strong> gibt an, wie genau der Timer treffen soll, und steht laut Handbuch standardmässig auf einer Minute. systemd nutzt diese Toleranz, um Aufwachvorgänge zu bündeln und den Rechner länger schlafen zu lassen. Wer es exakt braucht, setzt <code>AccuracySec=1us</code> – und zahlt das mit Stromverbrauch.</p>



<p class="wp-block-paragraph">Drei weitere Optionen sind gut zu kennen. <code>OnBootSec=</code> definiert einen Zeitpunkt relativ zum Systemstart, <code>OnUnitActiveSec=</code> einen relativ zur letzten Aktivierung der Zieleinheit. Kombiniert ergibt das „fünf Minuten nach dem Start und danach alle sechs Stunden", ohne jeden Kalender:</p>



<pre class="wp-block-code"><code>&#91;Timer]
OnBootSec=5min
OnUnitActiveSec=6h</code></pre>



<p class="wp-block-paragraph">Und <code>WakeSystem=true</code> weckt das System aus dem Bereitschaftsbetrieb, wenn der Timer fällig wird. Auf einem Server irrelevant, auf einem Heim-NAS mit Ruhezustand entscheidend.</p>



<p class="wp-block-paragraph">Soll der Timer eine Unit mit abweichendem Namen starten, gebt sie ausdrücklich an – <code>Unit=</code> ist laut Handbuch <em>„the unit to activate when this timer elapses"</em>. Nötig ist das nur, wenn ihr von der Namenskonvention abweicht.</p>



<h2 class="wp-block-heading">Nachsehen, ob es läuft: list-timers und das Journal</h2>



<p class="wp-block-paragraph">Der wichtigste Befehl im Alltag ist eine Übersicht aller Timer, sortiert nach dem nächsten Auslösezeitpunkt:</p>



<pre class="wp-block-code"><code>systemctl list-timers backup-home.timer</code></pre>



<p class="wp-block-paragraph">Die Ausgabe sieht so aus:</p>



<pre class="wp-block-code"><code>NEXT                 LEFT      UNIT               ACTIVATES
Do 2026-09-03 02:14  19h left  backup-home.timer  backup-home.service</code></pre>



<p class="wp-block-paragraph">Die Spalten sind in <a href="https://manpages.debian.org/unstable/systemd/systemctl.1.en.html">systemctl(1)</a> beschrieben: <code>NEXT</code> zeigt, wann der Timer das nächste Mal läuft, <code>LEFT</code> wie lange es bis dahin dauert, <code>LAST</code> und <code>PASSED</code> dasselbe rückwärts, <code>UNIT</code> den Namen des Timers und <code>ACTIVATES</code> den Dienst, den er startet. Ohne Argument listet der Befehl alle Timer des Systems auf – der schnellste Weg zu sehen, was auf einer fremden Maschine eigentlich alles nachts passiert. <code>systemctl list-timers --all</code> zeigt zusätzlich die inaktiven.</p>



<p class="wp-block-paragraph">Die 02:14 in der Ausgabe sind übrigens kein Tippfehler: Das ist <code>RandomizedDelaySec</code> bei der Arbeit.</p>



<p class="wp-block-paragraph">Was der Job beim letzten Lauf gesagt hat, steht im Journal. Die Option <code>-u</code> filtert laut <a href="https://manpages.debian.org/testing/systemd/journalctl.1.en.html">journalctl(1)</a> auf die Meldungen einer bestimmten Unit:</p>



<pre class="wp-block-code"><code>journalctl -u backup-home.service -n 50 --no-pager
journalctl -u backup-home.service --since "-7d" -p warning
journalctl -u backup-home.service -f</code></pre>



<p class="wp-block-paragraph">Die erste Zeile zeigt die letzten fünfzig Meldungen, die zweite alle Warnungen und Schlimmeres der vergangenen sieben Tage, die dritte hängt sich live an die Ausgabe und läuft bis <code>Strg+C</code>. Wer tiefer in die Fehlersuche einsteigen will, findet den Rest in unserer Anleitung <a href="https://yourdevice.ch/linux-problembehebung-im-systemd/">Linux Problembehebung im systemd</a>.</p>



<p class="wp-block-paragraph">Nützlich ist ausserdem <code>systemctl cat backup-home.timer</code>: Der Befehl zeigt die Unit so, wie systemd sie tatsächlich sieht, samt allen Drop-ins – und beendet jede Diskussion darüber, welche der drei Kopien nun gilt.</p>



<h2 class="wp-block-heading">Der eigentliche Gewinn: OnFailure meldet den Fehlschlag</h2>



<p class="wp-block-paragraph">Bis hierhin habt ihr einen Cronjob mit mehr Schreibarbeit. Der Unterschied beginnt jetzt. In <a href="https://manpages.debian.org/testing/systemd/systemd.unit.5.en.html">systemd.unit(5)</a> steht eine Option, die es unter Cron schlicht nicht gibt: <code>OnFailure=</code> ist <em>„a space-separated list of one or more units that are activated when this unit enters the 'failed' state."</em> Anders gesagt: Geht die Sicherung schief, startet systemd von sich aus eine zweite Unit eurer Wahl. Was diese Unit tut, ist euch überlassen – eine Push-Nachricht, eine Mail, ein Eintrag in ein Monitoring.</p>



<h3 class="wp-block-heading">Eine Benachrichtigungs-Unit als Vorlage anlegen</h3>



<p class="wp-block-paragraph">Damit ihr die Unit nicht für jeden Job neu schreibt, legt ihr sie als Vorlage an. Der Klammeraffe im Dateinamen macht daraus eine Template-Unit, deren Instanzname später den Namen des fehlgeschlagenen Dienstes trägt.</p>



<pre class="wp-block-code"><code>sudo nano /etc/systemd/system/alarm@.service</code></pre>



<pre class="wp-block-code"><code>&#91;Unit]
Description=Meldet den Fehlschlag von %i per ntfy

&#91;Service]
Type=oneshot
ExecStart=/usr/bin/curl -sS \
  -H "Title: Fehlgeschlagen: %i" \
  -H "Priority: 5" \
  -H "Tags: warning" \
  -d "Auf diesem System ist %i fehlgeschlagen. Details mit: journalctl -u %i -n 50" \
  https:&#47;&#47;ntfy.sh/EUER-LANGES-ZUFALLSTHEMA</code></pre>



<p class="wp-block-paragraph">Der Platzhalter <code>%i</code> ist in <a href="https://manpages.debian.org/testing/systemd/systemd.unit.5.en.html">systemd.unit(5)</a> als <em>Instance name</em> definiert: die Zeichenkette zwischen dem ersten <code>@</code> und der Endung. Ihr braucht die Unit also genau einmal, egal wie viele Jobs sie später melden soll.</p>



<p class="wp-block-paragraph">Prüft, ob <code>curl</code> überhaupt installiert ist, und ob der Pfad stimmt:</p>



<pre class="wp-block-code"><code>which curl</code></pre>



<p class="wp-block-paragraph">Liegt es woanders, tragt den tatsächlichen Pfad ein. <code>ExecStart=</code> verlangt einen absoluten Pfad und findet nichts über die PATH-Variable.</p>



<h3 class="wp-block-heading">Die Vorlage im Job eintragen</h3>



<p class="wp-block-paragraph">Ergänzt den Abschnitt <code>[Unit]</code> eurer Service-Unit um eine Zeile:</p>



<pre class="wp-block-code"><code>&#91;Unit]
Description=Naechtliche Sicherung des Home-Verzeichnisses
Wants=network-online.target
After=network-online.target
OnFailure=alarm@%n.service</code></pre>



<p class="wp-block-paragraph"><code>%n</code> ist laut Handbuch der <em>full unit name</em>, hier also <code>backup-home.service</code>. Aus <code>alarm@%n.service</code> wird damit die Unit <code>alarm@backup-home.service.service</code>, und in der Benachrichtigung steht <code>%i</code> für <code>backup-home.service</code>. Das sieht auf den ersten Blick nach einem Tippfehler aus und ist genau richtig so.</p>



<pre class="wp-block-code"><code>sudo systemctl daemon-reload</code></pre>



<h3 class="wp-block-heading">ntfy einrichten und den Alarm testen</h3>



<p class="wp-block-paragraph">ntfy verschickt Push-Nachrichten über einen einfachen HTTP-Aufruf. Die <a href="https://github.com/binwiederhier/ntfy/blob/main/docs/publish.md">Projektdokumentation</a> zeigt den Aufbau: Der Nachrichtentext geht per <code>-d</code> an eine URL, deren letzter Bestandteil das Thema ist; Titel, Priorität und Schlagwörter werden über die Kopfzeilen <code>Title</code>, <code>Priority</code> und <code>Tags</code> gesetzt. Priorität 5 ist die höchste von fünf Stufen.</p>



<p class="wp-block-paragraph"><strong>Sicherheitshinweis, und der ist ernst gemeint:</strong> Bei ntfy gibt es keine Anmeldung für das blosse Senden und Empfangen. Die Projektdokumentation formuliert das unmissverständlich: <em>„the topic is essentially a password"</em>, ihr sollt also etwas wählen, das nicht zu erraten ist. Wer <code>backup</code> als Thema nimmt, teilt seine Ausfallmeldungen mit der halben Welt. Nehmt eine lange Zufallszeichenkette, zum Beispiel erzeugt mit <code>head -c 18 /dev/urandom | base64 | tr -d '/+='</code>. Wer den Dienst nicht in fremden Händen haben will, betreibt ntfy selbst – der Server ist quelloffen und in einem Container schnell aufgesetzt.</p>



<p class="wp-block-paragraph">Installiert die ntfy-App auf dem Smartphone, abonniert dort euer Thema und löst dann absichtlich einen Fehler aus. Am einfachsten geht das mit einer Wegwerf-Unit:</p>



<pre class="wp-block-code"><code>sudo systemd-run --unit=alarmtest --property=OnFailure=alarm@alarmtest.service /bin/false</code></pre>



<p class="wp-block-paragraph"><code>/bin/false</code> beendet sich mit einem Fehlerstatus, die Unit geht damit in den Zustand <code>failed</code>, und das Telefon sollte klingeln. Kommt nichts an, prüft zuerst die Benachrichtigungs-Unit selbst:</p>



<pre class="wp-block-code"><code>journalctl -u "alarm@*" -n 30 --no-pager</code></pre>



<p class="wp-block-paragraph">Wollt ihr statt einer Push-Nachricht eine Mail, ersetzt den <code>curl</code>-Aufruf durch ein Skript, das <code>systemctl status %i</code> und <code>journalctl -u %i -n 50</code> einsammelt und an <code>sendmail</code> oder <code>msmtp</code> übergibt. Der Mechanismus bleibt derselbe; systemd interessiert sich nicht dafür, was die Unit tut, sondern nur dafür, dass sie startet. Für Erfolgsmeldungen gibt es das Gegenstück <code>OnSuccess=</code>, ausgelöst beim Wechsel in den Zustand <code>inactive</code>.</p>



<h2 class="wp-block-heading">Timer ohne Root: der Benutzerkontext</h2>



<p class="wp-block-paragraph">Nicht jede Aufgabe gehört ins Systemverzeichnis. Alles, was nur euer Benutzer betrifft – Mails abholen, ein Verzeichnis synchronisieren, eine Datensicherung eures Home – lässt sich im Benutzerkontext ablegen. Die Dateien liegen dann unter <code>~/.config/systemd/user/</code>, und sämtliche Befehle bekommen <code>--user</code> und kein <code>sudo</code>:</p>



<pre class="wp-block-code"><code>mkdir -p ~/.config/systemd/user
nano ~/.config/systemd/user/backup-home.service
nano ~/.config/systemd/user/backup-home.timer
systemctl --user daemon-reload
systemctl --user enable --now backup-home.timer
systemctl --user list-timers</code></pre>



<p class="wp-block-paragraph">Zwei Anpassungen sind nötig. Erstens entfällt die Zeile <code>User=</code>, denn der Dienst läuft ohnehin unter euch. Zweitens lautet der Abschnitt <code>[Install]</code> hier <code>WantedBy=default.target</code> statt <code>timers.target</code>.</p>



<p class="wp-block-paragraph">Und dann kommt die Falle, über die alle einmal stolpern: <strong>Benutzer-Units werden standardmässig beendet, sobald ihr euch abmeldet.</strong> Auf einem Server, an dem ihr euch nur zum Arbeiten anmeldet, läuft der Timer damit praktisch nie. Abhilfe schafft „Lingering", beschrieben in <a href="https://manpages.ubuntu.com/manpages/jammy/man1/loginctl.1.html">loginctl(1)</a>: <em>„If enabled for a specific user, a user manager is spawned for the user at boot and kept around after logouts."</em></p>



<pre class="wp-block-code"><code>sudo loginctl enable-linger mario
loginctl user-status mario</code></pre>



<p class="wp-block-paragraph">Ersetzt den Benutzernamen. Ab jetzt startet der Benutzermanager beim Systemstart und bleibt nach dem Abmelden bestehen. Rückgängig macht das <code>sudo loginctl disable-linger mario</code>.</p>



<p class="wp-block-paragraph">Das Journal des Benutzers lest ihr mit <code>journalctl --user -u backup-home.service</code>. Ohne <code>--user</code> sucht ihr an der falschen Stelle und findet nichts – ein Fehler, der schon manchen an seinem Verstand hat zweifeln lassen.</p>



<h2 class="wp-block-heading">Ein bestehendes Backup umstellen</h2>



<p class="wp-block-paragraph">Der häufigste Anwendungsfall ist die Sicherung. Wer nach unserer Anleitung <a href="https://yourdevice.ch/linux-pc-lokal-und-auf-nas-sichern/">Linux PC lokal und auf NAS sichern</a> mit Borg arbeitet, hat den Zeitplan bisher in der Oberfläche von Vorta hängen – was voraussetzt, dass die grafische Sitzung läuft. Ein Timer löst dieselbe Aufgabe unabhängig von Anmeldung und Desktop.</p>



<p class="wp-block-paragraph">Das Vorgehen in vier Schritten: den Ablauf in ein Skript unter <code>/usr/local/bin/</code> giessen und von Hand ausführen, bis er sauber durchläuft; Service- und Timer-Unit wie oben anlegen; <code>OnFailure=</code> eintragen und den Alarm testen; zuletzt den alten Cron-Eintrag entfernen – <code>crontab -e</code> für den Benutzer, <code>sudo crontab -e</code> für Root, dazu ein Blick in <code>/etc/cron.d/</code>. Wer den alten Eintrag stehen lässt, hat zwei Sicherungen, die sich um dasselbe Verzeichnis streiten.</p>



<p class="wp-block-paragraph">Ein Wort zum Rückgabewert: systemd erkennt einen Fehlschlag daran, dass der Prozess mit einem Status ungleich null endet. Ein Shell-Skript, das brav <code>exit 0</code> ans Ende schreibt oder dessen Fehler in einer Pipe verschwinden, meldet niemals einen Fehler – und dann nützt das schönste <code>OnFailure=</code> nichts. Setzt an den Anfang eures Skripts <code>set -euo pipefail</code>, dann bricht es bei einem Fehler ab und gibt ihn weiter.</p>



<h2 class="wp-block-heading">Wenn etwas nicht klappt</h2>



<p class="wp-block-paragraph"><strong>Der Timer taucht in <code>list-timers</code> nicht auf.</strong> Entweder fehlt <code>daemon-reload</code>, oder der Timer ist nur gestartet und nicht aktiviert, oder im Abschnitt <code>[Install]</code> fehlt <code>WantedBy=</code>. Prüft mit <code>systemctl is-enabled backup-home.timer</code>.</p>



<p class="wp-block-paragraph"><strong>Der Timer läuft, aber nichts passiert.</strong> Wahrscheinlich stimmt die Namenspaarung nicht. Der Timer <code>backup-home.timer</code> sucht <code>backup-home.service</code>; heisst eure Service-Datei anders, tragt <code>Unit=</code> im Abschnitt <code>[Timer]</code> ein. Die Spalte <code>ACTIVATES</code> in <code>list-timers</code> verrät, was er tatsächlich zu starten versucht.</p>



<p class="wp-block-paragraph"><strong>Die Unit geht sofort in <code>failed</code>, Status 203/EXEC.</strong> Der Pfad in <code>ExecStart=</code> stimmt nicht oder die Datei ist nicht ausführbar. Absoluter Pfad ist Pflicht, und <code>chmod +x</code> hilft.</p>



<p class="wp-block-paragraph"><strong>Status 217/USER oder 226/NAMESPACE.</strong> Der in <code>User=</code> angegebene Benutzer existiert nicht, oder ihm fehlt der Zugriff auf ein Verzeichnis. Prüft den Namen und die Rechte des Zielpfads.</p>



<p class="wp-block-paragraph"><strong>Das Skript läuft von Hand, aber nicht als Unit.</strong> Der Klassiker. Units erben eure Shell-Umgebung nicht: kein <code>PATH</code> wie im Terminal, keine Variablen aus <code>.bashrc</code>, kein SSH-Agent, kein <code>DISPLAY</code>. Schreibt absolute Pfade und setzt benötigte Variablen mit <code>Environment=</code> oder <code>EnvironmentFile=</code> in der Unit.</p>



<p class="wp-block-paragraph"><strong>Der Job läuft nachts nicht, weil der Rechner aus war.</strong> Dafür ist <code>Persistent=true</code> da. Bei einem Gerät im Ruhezustand hilft zusätzlich <code>WakeSystem=true</code>.</p>



<p class="wp-block-paragraph"><strong>Der Benutzer-Timer läuft nur, solange ihr angemeldet seid.</strong> <code>sudo loginctl enable-linger BENUTZER</code>, siehe oben.</p>



<p class="wp-block-paragraph"><strong>Der Alarm kommt nicht an.</strong> Prüft mit <code>journalctl -u "alarm@*"</code>, ob die Benachrichtigungs-Unit überhaupt gestartet ist. Wurde sie gestartet und <code>curl</code> meldet einen Fehler, fehlt meist die Netzwerkverbindung zum Zeitpunkt des Fehlschlags oder das Thema ist falsch geschrieben. Steht in der Ausgabe gar nichts, wurde <code>OnFailure=</code> nicht ausgelöst – dann endet euer Skript vermutlich mit Status null, obwohl es gescheitert ist.</p>



<h2 class="wp-block-heading">Fazit: Ein Job, der schweigt, ist kein Job</h2>



<p class="wp-block-paragraph">Der Mehraufwand gegenüber einer Cron-Zeile ist real und überschaubar: zwei Dateien statt einer Zeile, eine ungewohnte Zeitsyntax, ein Befehl zum Neuladen. Dafür bekommt ihr eine geplante Aufgabe, die sich wie jeder andere Dienst abfragen lässt, deren Ausgabe automatisch im Journal steht, die einen verpassten Termin nachholt und die euch anruft, wenn sie gescheitert ist.</p>



<p class="wp-block-paragraph">Der letzte Punkt ist der einzige, auf den es wirklich ankommt. Eine Sicherung, von der ihr nicht wisst, ob sie läuft, ist keine Sicherung, sondern eine Hoffnung mit Speicherplatzbedarf. Cron kann euch das nicht sagen, weil es dafür nie gebaut wurde. Ein Timer mit <code>OnFailure=</code> kann es, und der Aufwand dafür beträgt sechs Zeilen.</p>



<p class="wp-block-paragraph">Fangt mit dem einen Job an, dessen Ausfall euch stören würde, und stellt genau den um. Der Rest darf in Ruhe folgen – oder bei Cron bleiben. Es ist keine Glaubensfrage, sondern eine Frage danach, was passieren soll, wenn etwas schiefgeht.</p>



<h2 class="wp-block-heading">Quellen und weiterführende Links</h2>



<ul class="wp-block-list">
<li><a href="https://manpages.debian.org/testing/systemd/systemd.timer.5.en.html">systemd.timer(5)</a> – Handbuchseite zu Timer-Units: OnCalendar, Persistent, RandomizedDelaySec, AccuracySec, WakeSystem, Unit</li>



<li><a href="https://manpages.debian.org/testing/systemd/systemd.time.7.en.html">systemd.time(7)</a> – Kalenderausdrücke, Kurzformen und Zeitspannen</li>



<li><a href="https://manpages.debian.org/testing/systemd/systemd.unit.5.en.html">systemd.unit(5)</a> – OnFailure, OnSuccess und die Platzhalter %i und %n</li>



<li><a href="https://manpages.debian.org/testing/systemd/systemd.service.5.en.html">systemd.service(5)</a> – Type=oneshot, ExecStart, RemainAfterExit, SuccessExitStatus</li>



<li><a href="https://manpages.debian.org/testing/systemd/systemd.exec.5.en.html">systemd.exec(5)</a> – Logging sowie Standard-Ein- und -Ausgabe von Units</li>



<li><a href="https://manpages.debian.org/unstable/systemd/systemctl.1.en.html">systemctl(1)</a> – list-timers mit den Spalten NEXT, LEFT, LAST, PASSED, UNIT, ACTIVATES sowie daemon-reload und cat</li>



<li><a href="https://manpages.debian.org/testing/systemd/systemd-analyze.1.en.html">systemd-analyze(1)</a> – die Unterbefehle calendar, timespan und verify</li>



<li><a href="https://manpages.debian.org/testing/systemd/journalctl.1.en.html">journalctl(1)</a> – die Optionen -u, --since, -p, -f und --user</li>



<li><a href="https://manpages.ubuntu.com/manpages/jammy/man1/loginctl.1.html">loginctl(1)</a> – enable-linger, disable-linger und user-status</li>



<li><a href="https://github.com/binwiederhier/ntfy/blob/main/docs/publish.md">ntfy: Sending messages</a> – Aufbau des Publish-Aufrufs, Kopfzeilen Title, Priority und Tags, Hinweis zur Vertraulichkeit des Themas</li>



<li><a href="https://docs.aws.amazon.com/linux/al2023/ug/cron.html">Amazon Linux 2023: Cron und systemd-Timer</a> – Begründung für den Verzicht auf cronie</li>



<li><a href="https://yourdevice.ch/cronjob-fuer-eure-nextcloud-erstellen/">Cronjob für Eure Nextcloud erstellen</a> – der klassische Weg mit crontab</li>



<li><a href="https://yourdevice.ch/linux-problembehebung-im-systemd/">Linux Problembehebung im systemd</a> – Fehler im System mit journalctl eingrenzen</li>



<li><a href="https://yourdevice.ch/stdout-stderr-und-dev-null-die-wichtigsten-linux-datenstroeme-verstaendlich-erklaert/">stdout, stderr und /dev/null</a> – warum Cron-Ausgaben so oft verschwinden</li>



<li><a href="https://yourdevice.ch/linux-pc-lokal-und-auf-nas-sichern/">Linux PC lokal und auf NAS sichern</a> – Borg und Vorta als Praxisbeispiel</li>
</ul>
<p>The post <a href="https://yourdevice.ch/systemd-timer-statt-cronjob/">systemd-Timer statt Cronjob: einrichten und überwachen</a> appeared first on <a href="https://yourdevice.ch">yourdevice.ch - Deine Anlaufstelle für Linux, OpenSource Software und Co</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://yourdevice.ch/systemd-timer-statt-cronjob/feed/</wfw:commentRss>
			<slash:comments>1</slash:comments>
		
		
			</item>
		<item>
		<title>Fehler mit fehlenden Debian APT-Schlüsseln beheben</title>
		<link>https://yourdevice.ch/fehler-mit-fehlenden-debian-apt-schluesseln-beheben/</link>
					<comments>https://yourdevice.ch/fehler-mit-fehlenden-debian-apt-schluesseln-beheben/#comments</comments>
		
		<dc:creator><![CDATA[Mario]]></dc:creator>
		<pubDate>Sun, 23 Mar 2025 08:00:00 +0000</pubDate>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[Paketmanager]]></category>
		<category><![CDATA[Problembehebung]]></category>
		<guid isPermaLink="false">https://yourdevice.ch/?p=18048</guid>

					<description><![CDATA[<p>In diesem Beitrag lernt ihr, wie ihr Fehler mit fehlenden Debian APT-Schlüsseln beheben könnt. Seit 2025 entfernt Debian die Unterstützung für globale APT-Schlüssel in /etc/apt/trusted.gpg.d/. Stattdessen müssen APT-Quellen explizit mit...</p>
<p>The post <a href="https://yourdevice.ch/fehler-mit-fehlenden-debian-apt-schluesseln-beheben/">Fehler mit fehlenden Debian APT-Schlüsseln beheben</a> appeared first on <a href="https://yourdevice.ch">yourdevice.ch - Deine Anlaufstelle für Linux, OpenSource Software und Co</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">In diesem Beitrag lernt ihr, wie ihr Fehler mit fehlenden Debian APT-Schlüsseln beheben könnt. Seit 2025 entfernt Debian die Unterstützung für globale APT-Schlüssel in <code>/etc/apt/trusted.gpg.d/</code>. Stattdessen müssen APT-Quellen explizit mit <code>signed-by</code> konfiguriert werden.</p>


<div class="wp-block-image">
<figure class="aligncenter size-full"><img decoding="async" width="892" height="541" src="https://yourdevice.ch/wp-content/uploads/2025/03/apt_keyring_error_title.png" alt="" class="wp-image-20072" style="object-fit:cover" srcset="https://yourdevice.ch/wp-content/uploads/2025/03/apt_keyring_error_title.png 892w, https://yourdevice.ch/wp-content/uploads/2025/03/apt_keyring_error_title-300x182.png 300w, https://yourdevice.ch/wp-content/uploads/2025/03/apt_keyring_error_title-768x466.png 768w, https://yourdevice.ch/wp-content/uploads/2025/03/apt_keyring_error_title-500x303.png 500w" sizes="(max-width: 892px) 100vw, 892px" /></figure>
</div>




<h2 class="wp-block-heading">Hauptproblem</h2>



<p class="wp-block-paragraph">Falls ihr also beim Aktualisieren eures Systems eine Warnung oder Fehlermeldung wie diese erhaltet:</p>



<pre class="wp-block-code"><code>debsuryorg-archive-keyring (2025.03.11) unstable; urgency=medium

  * The /etc/apt/trusted.gpg.d/debsuryorg-archive.gpg global APT key will
    been removed in the next update of the package.

    The script will try to autodetect whether any APT repository is not
    configured with signed-by= directive and will print warning about the
    installation of this package.

    You need to manually add:

    &#091;signed-by=/usr/share/keyrings/debsuryorg-archive-keyring.gpg]

    to your APT sources lists.  See the Debian Wiki for more information:

    https:&#47;&#47;wiki.debian.org/DebianRepository/UseThirdParty#Sources.list_entry

 -- Ondřej Surý &lt;ondrej@debian.org&gt;  Tue, 11 Mar 2025 14:08:14 +0100</code></pre>



<p class="wp-block-paragraph">müsst ihr eure APT-Quellen entsprechend anpassen.</p>



<h2 class="wp-block-heading">Schritt-für-Schritt-Anleitung</h2>



<h3 class="wp-block-heading">Überprüfen, ob das Debsury.org-Repository genutzt wird</h3>



<p class="wp-block-paragraph">Führt folgenden Befehl aus, um zu sehen, ob du das Repository in euren APT-Quellen habt:</p>



<pre class="wp-block-code"><code>grep -r "sury" /etc/apt/sources.list /etc/apt/sources.list.d/</code></pre>



<p class="wp-block-paragraph">Falls eine Zeile wie diese erscheint:</p>



<pre class="wp-block-code"><code>deb http://packages.sury.org/php/ bookworm main</code></pre>



<p class="wp-block-paragraph">müsst ihr sie anpassen da diese Zeile nicht mehr dem neuen Standard entspricht. </p>



<h3 class="wp-block-heading">APT-Quellen aktualisieren</h3>



<p class="wp-block-paragraph">Falls das Repository in einer Datei wie <code>/etc/apt/sources.list.d/php.list</code> steht, bearbeitet diese mit:</p>



<pre class="wp-block-code"><code>sudo nano /etc/apt/sources.list.d/php.list</code></pre>



<p class="wp-block-paragraph">Ändert die Zeile von:</p>



<pre class="wp-block-code"><code>deb http://packages.sury.org/php/ bookworm main</code></pre>



<p class="wp-block-paragraph">zu:</p>



<pre class="wp-block-code"><code>deb <strong>&#091;signed-by=/usr/share/keyrings/debsuryorg-archive-keyring.gpg]</strong> https://packages.sury.org/php/ bookworm main</code></pre>



<p class="wp-block-paragraph">Speichert die Datei mit <code><strong>STRG + X</strong></code>, dann <code><strong>Y</strong></code> und <code><strong>ENTER</strong></code>.</p>


<div class="wp-block-image">
<figure class="aligncenter size-large is-resized"><img loading="lazy" decoding="async" width="1024" height="448" src="https://yourdevice.ch/wp-content/uploads/2025/03/php_repo_korrigieren-1024x448.png" alt="" class="wp-image-18051" style="width:750px" srcset="https://yourdevice.ch/wp-content/uploads/2025/03/php_repo_korrigieren-1024x448.png 1024w, https://yourdevice.ch/wp-content/uploads/2025/03/php_repo_korrigieren-300x131.png 300w, https://yourdevice.ch/wp-content/uploads/2025/03/php_repo_korrigieren-768x336.png 768w, https://yourdevice.ch/wp-content/uploads/2025/03/php_repo_korrigieren-1536x671.png 1536w, https://yourdevice.ch/wp-content/uploads/2025/03/php_repo_korrigieren-2048x895.png 2048w, https://yourdevice.ch/wp-content/uploads/2025/03/php_repo_korrigieren-500x219.png 500w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>
</div>


<h3 class="wp-block-heading">GPG-Schlüssel herunterladen und speichern</h3>



<p class="wp-block-paragraph">Falls ihr den neuen Schlüssel noch nicht habt oder unsicher seid, ob er korrekt gespeichert wurde, könnt ihr ihn mit folgendem Befehl herunterladen und am richtigen Ort ablegen:</p>



<pre class="wp-block-code"><code>curl -fsSL https://packages.sury.org/php/apt.gpg | sudo tee /usr/share/keyrings/debsuryorg-archive-keyring.gpg &gt; /dev/null</code></pre>



<p class="wp-block-paragraph">Dieser Befehl lädt den aktuellen GPG-Schlüssel herunter und speichert ihn in <code>/usr/share/keyrings/</code>.</p>



<h3 class="wp-block-heading">Paketlisten aktualisieren</h3>



<p class="wp-block-paragraph">Sobald die Datei angepasst und der neue Schlüssel gespeichert wurde, ladet die Paketlisten neu:</p>



<pre class="wp-block-code"><code>sudo apt update</code></pre>



<p class="wp-block-paragraph">Falls keine Fehlermeldungen mehr erscheinen, ist alles korrekt konfiguriert!</p>



<h2 class="wp-block-heading">Andere betroffene APT-Repositories identifizieren und korrigieren</h2>



<p class="wp-block-paragraph">Fall ihr weitere betroffene Repositories habt, könnt ihr sie mit folgendem Befehl auflisten:</p>



<pre class="wp-block-code"><code>grep -r "deb " /etc/apt/sources.list /etc/apt/sources.list.d/</code></pre>



<p class="wp-block-paragraph">Falls Zeilen ohne <code><strong>[signed-by=...]</strong></code> erscheinen, müssen sie entsprechend angepasst werden.</p>



<p class="wp-block-paragraph">Ihr könnt auch nach alten Schlüsseln suchen:</p>



<pre class="wp-block-code"><code>ls /etc/apt/trusted.gpg.d/</code></pre>



<p class="wp-block-paragraph">Falls ein anderes Repository betroffen ist (z. B. <code>nginx</code>, <code>crowdsec, apache oder anderes</code>), öffnet die entsprechende Datei:</p>



<pre class="wp-block-code"><code>sudo nano /etc/apt/sources.list.d/nginx.list</code></pre>



<p class="wp-block-paragraph">Passt die Zeile an:</p>



<pre class="wp-block-code"><code>deb http://nginx.org/packages/debian/ bookworm nginx</code></pre>



<p class="wp-block-paragraph">zu:</p>



<pre class="wp-block-code"><code>deb <strong>&#091;signed-by=/usr/share/keyrings/nginx-archive-keyring.gpg]</strong> https://nginx.org/packages/debian/ bookworm nginx</code></pre>



<p class="wp-block-paragraph">Speichert die Datei und ladet den passenden Schlüssel herunter:</p>



<pre class="wp-block-code"><code>curl -fsSL <strong>https://nginx.org/keys/nginx_signing.key</strong> | sudo tee /usr/share/keyrings/nginx-archive-keyring.gpg &gt; /dev/null</code></pre>



<p class="wp-block-paragraph">Danach aktualisiert die Paketlisten:</p>



<pre class="wp-block-code"><code>sudo apt update</code></pre>



<p class="wp-block-paragraph">Falls weitere Repositories betroffen sind, könnt ihr die gleiche Methode anwenden:</p>



<ul class="wp-block-list">
<li><code>signed-by</code> hinzufügen</li>



<li>Den passenden GPG-Schlüssel herunterladen</li>



<li><code>apt update</code> ausführen</li>
</ul>



<h2 class="wp-block-heading">Wo finde ich die passenden <code>signed-by</code> Schlüssel</h2>



<p class="wp-block-paragraph">Falls ihr nicht wisst, wo ihr die korrekten GPG-Schlüssel für ein bestimmtes Repository findet, gibt es mehrere Möglichkeiten:</p>



<ol start="1" class="wp-block-list">
<li><strong>Offizielle Dokumentation des Repository-Anbieters</strong><br>Viele Anbieter listen die korrekten GPG-Schlüssel und <code>signed-by</code> Konfigurationen auf ihrer Website.</li>



<li><strong>APT-Fehlermeldungen prüfen</strong><br>Falls <code>apt update</code> fehlschlägt, gibt es oft eine Meldung, die dir den fehlenden Schlüssel nennt.</li>



<li><strong>Manuell über die Schlüsselserver suchen</strong><br>Falls der Schlüssel öffentlich verfügbar ist, könnt ihr ihn mit folgendem Befehl abrufen:<code>gpg --keyserver keyserver.ubuntu.com --recv-keys &lt;Schlüssel-ID&gt;</code> Danach könnt ihr ihn in das Keyring-Verzeichnis verschieben: <code>gpg --export &lt;Schlüssel-ID&gt; | sudo tee /usr/share/keyrings/&lt;repo&gt;-archive-keyring.gpg &gt; /dev/null</code></li>



<li><strong>APT-Quellen selbst inspizieren</strong><br>Falls ihr bereits Pakete aus einem Repository installiert habt, könnte sich der passende Schlüssel in einer <code>.gpg</code>-Datei befinden:<code>ls /usr/share/keyrings/</code></li>
</ol>



<p class="wp-block-paragraph">Falls ihr den passenden Schlüssel nicht findet, hilft oft eine Suche mit einer Suchmaschine eurer Wahl mit <code>"GPG key for &lt;Repository-Name&gt;"</code>.</p>



<h2 class="wp-block-heading">Fazit</h2>



<p class="wp-block-paragraph">Diese Änderung ist Teil einer Sicherheitsverbesserung in Debian, um die globale APT-Schlüsselverwaltung abzuschaffen und stattdessen Repository-spezifische Signaturen zu erzwingen. Durch diese Schritte stellt ihr sicher, dass ihr weiterhin Updates von <code>packages.sury.org</code> und anderen Quellen ohne Probleme erhaltet. Weitere Hilfen um dass Linux System korrekt zu updaten, findet ihr <a href="https://yourdevice.ch/linux-einfach-updaten/">hier</a>.</p>



<p class="wp-block-paragraph">Quellen:</p>



<p class="wp-block-paragraph"><a href="https://wiki.debian.org/DebianRepository/UseThirdParty#Sources.list_entry">https://wiki.debian.org/DebianRepository/UseThirdParty#Sources.list_entry</a></p>
<p>The post <a href="https://yourdevice.ch/fehler-mit-fehlenden-debian-apt-schluesseln-beheben/">Fehler mit fehlenden Debian APT-Schlüsseln beheben</a> appeared first on <a href="https://yourdevice.ch">yourdevice.ch - Deine Anlaufstelle für Linux, OpenSource Software und Co</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://yourdevice.ch/fehler-mit-fehlenden-debian-apt-schluesseln-beheben/feed/</wfw:commentRss>
			<slash:comments>6</slash:comments>
		
		
			</item>
		<item>
		<title>Update Fehler unter Debian basierten Systemen beheben</title>
		<link>https://yourdevice.ch/update-fehler-unter-debian-basierten-systemen-beheben/</link>
					<comments>https://yourdevice.ch/update-fehler-unter-debian-basierten-systemen-beheben/#respond</comments>
		
		<dc:creator><![CDATA[Mario]]></dc:creator>
		<pubDate>Sun, 02 Feb 2025 09:23:31 +0000</pubDate>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[Problembehebung]]></category>
		<category><![CDATA[Programme]]></category>
		<category><![CDATA[Updates]]></category>
		<guid isPermaLink="false">https://yourdevice.ch/?p=17666</guid>

					<description><![CDATA[<p>Updates unter Linux brechen manchmal ab – sei es durch Systemabstürze, hängengebliebene apt- oder dpkg-Prozesse oder unerwartete Fehler. In diesem Tutorial zeigen wir euch, wie ihr Update-Probleme auf Debian-basierten Systemen...</p>
<p>The post <a href="https://yourdevice.ch/update-fehler-unter-debian-basierten-systemen-beheben/">Update Fehler unter Debian basierten Systemen beheben</a> appeared first on <a href="https://yourdevice.ch">yourdevice.ch - Deine Anlaufstelle für Linux, OpenSource Software und Co</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Updates unter <a href="https://yourdevice.ch/warum-linux/">Linux</a> brechen manchmal ab – sei es durch Systemabstürze, hängengebliebene <code>apt</code>- oder <code>dpkg</code>-Prozesse oder unerwartete Fehler. In diesem Tutorial zeigen wir euch, wie ihr Update-Probleme auf Debian-basierten Systemen wie Ubuntu oder Linux Mint effektiv beheben könnt. Egal, ob der <a href="https://de.wikipedia.org/wiki/Paketverwaltung">Paketmanager</a> nicht mehr reagiert, Sperrdateien (<code>lock</code>-Files) Probleme verursachen oder fehlerhafte Pakete das System blockieren – hier findet ihr die passenden Lösungen.</p>


<div class="wp-block-image">
<figure class="aligncenter size-full"><img loading="lazy" decoding="async" width="667" height="352" src="https://yourdevice.ch/wp-content/uploads/2025/01/updatefehler_Title.png" alt="" class="wp-image-17672" srcset="https://yourdevice.ch/wp-content/uploads/2025/01/updatefehler_Title.png 667w, https://yourdevice.ch/wp-content/uploads/2025/01/updatefehler_Title-300x158.png 300w, https://yourdevice.ch/wp-content/uploads/2025/01/updatefehler_Title-500x264.png 500w" sizes="auto, (max-width: 667px) 100vw, 667px" /></figure>
</div>




<h2 class="wp-block-heading">Was ist das Problem</h2>



<p class="wp-block-paragraph">Beim Aktualisieren eines Debian-basierten Systems (z. B. Linux Mint, Ubuntu oder Debian) kann es in seltenen Fällen zu Problemen kommen wenn ein Update durchgeführt wird. Häufige Symptome sind:</p>



<ul class="wp-block-list">
<li>Die Aktuallsierungsverwaltung von Linux Mint spinnt, und updates lassen sich nicht installieren</li>



<li>Das herunterfahren verlangt plötzlich ein Passwort.</li>



<li>Fehlermeldungen im Terminal: <code>E: dpkg was interrupted, you must manually run 'dpkg --configure -a' to correct the problem.</code></li>



<li>Paketmanager (<code>apt</code>, <code>dpkg</code> oder <code>synaptic</code>) bleibt hängen.</li>



<li>"Dateien werden bereits von einem anderen Prozess verwendet".</li>



<li><code>Could not get lock /var/lib/dpkg/lock</code> oder <code>Could not open lock file /var/lib/apt/lists/lock</code>.</li>
</ul>



<p class="wp-block-paragraph">In diesem Tutorial gehen wir Schritt für Schritt durch, wie man diese Probleme lösen kann.</p>



<h2 class="wp-block-heading"><strong>Prüfen, ob ein anderer Prozess läuft</strong></h2>



<p class="wp-block-paragraph">Zuerst ist es wichtig zu sagen, dass ihr bei einem Update-Problem das System am besten nicht neustartet, bis ihr das Problem behoben habt, ansonsten kann es in selten Fällen dazu kommen, dass das System nicht mehr hochfährt, wenn ein extrem wichtiges Paket beim Updaten beschädigt worden ist. </p>



<p class="wp-block-paragraph">Um das Problem zu beheben überprüfen wir, ob gerade ein Update oder Installationsprogramm läuft. Auf <strong>Linux Mint</strong> geht das zum Beispiel bequem über die Systemüberwachung. Öffnet diese über die <strong>Suche</strong>, und sucht oben rechts mit dem Lupensymbol nach <code>apt</code>.</p>


<div class="wp-block-image">
<figure class="aligncenter size-full is-resized"><img loading="lazy" decoding="async" width="2134" height="1086" src="https://yourdevice.ch/wp-content/uploads/2025/01/updatefehler_systeminformationen.png" alt="" class="wp-image-17668" style="width:750px" srcset="https://yourdevice.ch/wp-content/uploads/2025/01/updatefehler_systeminformationen.png 2134w, https://yourdevice.ch/wp-content/uploads/2025/01/updatefehler_systeminformationen-300x153.png 300w, https://yourdevice.ch/wp-content/uploads/2025/01/updatefehler_systeminformationen-1024x521.png 1024w, https://yourdevice.ch/wp-content/uploads/2025/01/updatefehler_systeminformationen-768x391.png 768w, https://yourdevice.ch/wp-content/uploads/2025/01/updatefehler_systeminformationen-1536x782.png 1536w, https://yourdevice.ch/wp-content/uploads/2025/01/updatefehler_systeminformationen-2048x1042.png 2048w, https://yourdevice.ch/wp-content/uploads/2025/01/updatefehler_systeminformationen-500x254.png 500w" sizes="auto, (max-width: 2134px) 100vw, 2134px" /><figcaption class="wp-element-caption">Anscheinend hängt hier ein apt-get Befehl mit der ID 7400</figcaption></figure>
</div>


<p class="wp-block-paragraph">Falls ein Update unterbrochen wurde oder Pakete beschädigt sind, kommt meisstens bei einem erneuten Update Befehl ein Fehler, dieser schaut dann auf dem Terminal meisst so aus:</p>


<div class="wp-block-image">
<figure class="aligncenter size-large is-resized"><img loading="lazy" decoding="async" width="1024" height="148" src="https://yourdevice.ch/wp-content/uploads/2025/01/update_fehler_apt-lock-1024x148.png" alt="" class="wp-image-17669" style="width:750px" srcset="https://yourdevice.ch/wp-content/uploads/2025/01/update_fehler_apt-lock-1024x148.png 1024w, https://yourdevice.ch/wp-content/uploads/2025/01/update_fehler_apt-lock-300x43.png 300w, https://yourdevice.ch/wp-content/uploads/2025/01/update_fehler_apt-lock-768x111.png 768w, https://yourdevice.ch/wp-content/uploads/2025/01/update_fehler_apt-lock-1536x222.png 1536w, https://yourdevice.ch/wp-content/uploads/2025/01/update_fehler_apt-lock-2048x296.png 2048w, https://yourdevice.ch/wp-content/uploads/2025/01/update_fehler_apt-lock-500x72.png 500w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>
</div>


<p class="wp-block-paragraph">Über das Terminal könnt ihr auch nach einem Apt Prozess suchen:</p>



<pre class="wp-block-code"><code>ps aux | grep -E apt</code></pre>



<p class="wp-block-paragraph">Falls ein Prozess wie <code>apt-get</code> aktiv ist, müssen wir zu allerst versuchen, ihn mit einem <code>kill</code> Befehl zu beenden:</p>



<pre class="wp-block-code"><code>sudo killall apt apt-get dpkg</code></pre>



<p class="wp-block-paragraph">Falls das nicht hilft, könnt ihr den Prozess manuell mit der PID (Prozess-ID) beenden:</p>



<pre class="wp-block-code"><code>sudo kill -9 &lt;PID&gt;</code></pre>



<p class="wp-block-paragraph">Ersetze <code>&lt;PID&gt;</code> mit der jeweiligen Prozess-ID, die ihr vorher mit der Systemüberwachung oder im Terminal via  <code>ps aux</code> herausgefunden habt. In meinem Fall wäre das die ID <strong>7400</strong></p>



<p class="wp-block-paragraph">Solltet ihr mit dem killen des apt Prozess kein Erfolg haben, springt zu Punkt 3, ansonsten, lasst ihr Punkt 3 unten aus!</p>



<h2 class="wp-block-heading"><strong>2. Paketverwaltung reparieren</strong></h2>



<p class="wp-block-paragraph">Sollte Apt erfolgreich beendet worden sein, müssen wir als nächstes die Fehler beheben. Wichtig ist, euer System jetzt nicht herunterzufahren, und später zu starten. Das kann in selten Fällen dazu führen, dass das System nicht wieder hochfährt. Um Update-Fehler zu beheben, müssen wir apt/dpkg und entsprechende Pakete rekonfigurieren. Das geht automatisch über einen Befehl:</p>



<pre class="wp-block-code"><code>sudo dpkg --configure -a</code></pre>



<p class="wp-block-paragraph">Dies rekonfiguriert alle abgebrochenen updates. Ist zum Beispiel das Update von Grub fehlgeschlagen, musst es ebenfalls frisch konfiguriert werden. Bitte nehmt hier dann unbedingt eure Platte, auf dem euer System läuft:</p>


<div class="wp-block-image">
<figure class="aligncenter size-full is-resized"><img loading="lazy" decoding="async" width="2113" height="1052" src="https://yourdevice.ch/wp-content/uploads/2025/01/updatefehler_grub.png" alt="" class="wp-image-17670" style="width:750px" srcset="https://yourdevice.ch/wp-content/uploads/2025/01/updatefehler_grub.png 2113w, https://yourdevice.ch/wp-content/uploads/2025/01/updatefehler_grub-300x149.png 300w, https://yourdevice.ch/wp-content/uploads/2025/01/updatefehler_grub-1024x510.png 1024w, https://yourdevice.ch/wp-content/uploads/2025/01/updatefehler_grub-768x382.png 768w, https://yourdevice.ch/wp-content/uploads/2025/01/updatefehler_grub-1536x765.png 1536w, https://yourdevice.ch/wp-content/uploads/2025/01/updatefehler_grub-2048x1020.png 2048w, https://yourdevice.ch/wp-content/uploads/2025/01/updatefehler_grub-500x249.png 500w" sizes="auto, (max-width: 2113px) 100vw, 2113px" /></figure>
</div>


<p class="wp-block-paragraph">Hier muss die System Platte, also <code>/dev/sdx</code> ausgewählt werden, und auf keinen Fall Partitionen mit den Nummern da hinter, zum Beispiel <code>/dev/sdx1</code>. </p>



<p class="wp-block-paragraph">In den meissten Fällen ist aber ein manuelles Eingreifen nicht notwendig. </p>



<p class="wp-block-paragraph">Falls andere Pakete noch nicht vollständig installiert wurden:</p>



<pre class="wp-block-code"><code>sudo apt-get install -f</code></pre>



<h2 class="wp-block-heading"><strong>3. Locks entfernen</strong> (optional)</h2>



<p class="wp-block-paragraph">Falls <code>dpkg</code> oder <code>apt</code> eine Sperrdatei (<code>lock</code>-File) erstellt hat, die nicht automatisch entfernt wurde, kann dies Updates blockieren.</p>



<p class="wp-block-paragraph">Überprüfe, ob folgende Sperrdateien existieren:</p>



<pre class="wp-block-code"><code>ls -l /var/lib/dpkg/lock
ls -l /var/lib/dpkg/lock-frontend
ls -l /var/lib/apt/lists/lock
ls -l /var/cache/apt/archives/lock</code></pre>



<p class="wp-block-paragraph">Falls eine oder mehrere existieren und kein Prozess mehr läuft, könnt ihr sie manuell löschen:</p>



<pre class="wp-block-code"><code>sudo rm -f /var/lib/dpkg/lock
sudo rm -f /var/lib/dpkg/lock-frontend
sudo rm -f /var/lib/apt/lists/lock
sudo rm -f /var/cache/apt/archives/lock</code></pre>



<p class="wp-block-paragraph">Danach könnt ihr das Paketmanagement wieder korrekt initialisieren:</p>



<pre class="wp-block-code"><code>sudo dpkg --configure -a</code></pre>



<h2 class="wp-block-heading"><strong>4. Cache leeren und Paketquellen neu einlesen</strong></h2>



<p class="wp-block-paragraph">Falls das Problem weiterhin besteht, kann es helfen, den Paket-Cache zu leeren und die Paketquellen neu zu laden:</p>



<pre class="wp-block-code"><code>sudo apt-get clean
sudo apt-get autoclean
sudo apt-get update</code></pre>



<p class="wp-block-paragraph">Falls <code>update</code> Probleme macht, kann ein erneutes Generieren der Paketquellen helfen:</p>



<pre class="wp-block-code"><code>sudo rm -rf /var/lib/apt/lists/*
sudo apt-get update</code></pre>



<h2 class="wp-block-heading"><strong>5. Beschädigte Pakete entfernen</strong></h2>



<p class="wp-block-paragraph">Falls noch immer Fehler auftreten, kann es sein, dass ein beschädigtes oder unvollständiges Paket vorhanden ist.</p>



<p class="wp-block-paragraph">Liste beschädigte Pakete auf:</p>



<pre class="wp-block-code"><code>dpkg -l | grep -v ^ii</code></pre>



<p class="wp-block-paragraph">Falls ihr ein fehlerhaftes Paket findet, könnt du es mit folgendem Befehl entfernen:</p>



<pre class="wp-block-code"><code>sudo apt-get remove --purge &lt;Paketname&gt;</code></pre>



<p class="wp-block-paragraph">Falls <code>remove</code> nicht funktioniert, könnt ihr es manuell aus <code>dpkg</code> entfernen:</p>



<pre class="wp-block-code"><code>sudo dpkg --remove --force-remove-reinstreq &lt;Paketname&gt;</code></pre>



<p class="wp-block-paragraph">Danach:</p>



<pre class="wp-block-code"><code>sudo apt-get install -f</code></pre>



<h2 class="wp-block-heading"><strong>6. Neustart und erneuter Test</strong></h2>



<p class="wp-block-paragraph">Nach den oben genannten Schritten kann ein Neustart helfen:</p>



<pre class="wp-block-code"><code>sudo reboot</code></pre>



<p class="wp-block-paragraph">Danach erneut testen:</p>



<pre class="wp-block-code"><code>sudo apt update &amp;&amp; sudo apt upgrade</code></pre>



<p class="wp-block-paragraph">Falls immer noch Probleme bestehen, könnte es an defekten Paketen oder einer beschädigten <code>sources.list</code> liegen.</p>



<h2 class="wp-block-heading"><strong>Fazit</strong></h2>



<p class="wp-block-paragraph">Mit diesen Methoden könnt ihr die meisten Probleme mit <code>apt</code> und <code>dpkg</code> auf Debian-basierten Systemen beheben. Falls sich <code>apt</code> oder <code>dpkg</code> aufhängt, reicht es oft schon, den laufenden Prozess zu beenden und <code>dpkg --configure -a</code> auszuführen.</p>



<p class="wp-block-paragraph">Falls ihr nach diesen Schritten immer noch Probleme habt, könnte es ein tiefergehendes Problem mit den Paketquellen oder einer fehlerhaften Systemkonfiguration sein. In diesem Fall lohnt sich ein Blick in die <code>/var/log/apt/</code>-Logs, um den Fehler zu finden. Im schlimmsten Fall setzt ihr auf ein wenige Tage altes <a href="https://yourdevice.ch/systemwiederherstellung-unter-linux-mit-timeshift/">Timeshift Backup</a>.</p>



<p class="wp-block-paragraph">Viel Erfolg! 🚀</p>
<p>The post <a href="https://yourdevice.ch/update-fehler-unter-debian-basierten-systemen-beheben/">Update Fehler unter Debian basierten Systemen beheben</a> appeared first on <a href="https://yourdevice.ch">yourdevice.ch - Deine Anlaufstelle für Linux, OpenSource Software und Co</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://yourdevice.ch/update-fehler-unter-debian-basierten-systemen-beheben/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
