[[Vorlage(Getestet, general)]] {{{#!vorlage Wissen [:Terminal: Ein Terminal öffnen] [:Root-Rechte:Als Root arbeiten] }}} [[Inhaltsverzeichnis(2)]] [[Bild(Wiki/Icons/time.png, 48, align=left)]] Der [:Dienste:Dienst] [wikipedia:Cron:] erledigt automatisch wiederkehrende Aufgaben. Dazu startet er Skripte und Programme zu vorgegebenen Zeiten oder bei bestimmten Ereignissen. Es gibt für diesen Zweck mehrere Programme mit individuellen Besonderheiten. Dieser Artikel beschränkt sich auf die bei Ubuntu standardmäßig installierten Programme. Das Cron-System besteht bei Ubuntu aus dem von Debian modifiziertem "Vixie Cron" in Kombination mit dem Programm Anacron. Dabei kümmert sich Cron um Aufgaben, die zu bestimmten festen Zeiten ausgeführt werden sollen, und Anacron betreut Aufgaben, die periodisch (täglich, alle N Tage z.B. wöchentlich oder monatlich erledigt werden müssen. Cron selber ist gedacht für ständig durchlaufende Rechner, denn während Stillstandszeiten geplante Aufgaben wird Cron beim Wiederanlauf des Rechners nicht nachholen im Gegensatz zu Anacron, der explizit solche Situationen berücksichtigt. Eine Alternative – mit tendenziell einfacherer Syntax – können [:systemd/Timer Units:] sein. {{{#!vorlage Hinweis Cron bzw. Anacron übernehmen bei Ubuntu immer noch wichtige Aufgaben bei der Pflege des Systems, auch wenn viele (aber nicht alle) seiner früheren Aufgaben wie Bereinigung (scrub) von ext2/3/4-Dateisystemen, Verwaltung des Systemlogs, Pflege der Software-Paketquellen u.a. bereits über Systemd-Timer angestoßen werden. Erweiterungen des Systems mit eigenen Aufgaben sind selbstverständlich möglich, erfordern aber Vorsicht, damit diese wichtigen Systemaufgaben nicht beeinträchtigt werden. }}} = Installation = Der Dienst und seine Verwaltungswerkzeuge für die Kommandozeile ist in jeder Ubuntu-Installation bereits enthalten: * '''cron''', „Daemon für die Zeitplanung von Prozessen“ aus main * '''anacron''', „cron-ähnliches Programm, das sich nicht nach der Zeit richtet“ aus main = Arbeitsweise = Der Dienst Cron wird bei Ubuntu automatisch durch das Init-System [:systemd:] gestartet; zuständig dafür die die [:systemd/Units:Unit] `cron.service` aus dem Ordner '''/lib/systemd/system/'''. Cron überprüft dann einmal jede Minute seine Konfigurationsdateien und startet zeitgerecht die definierten Programme. Beim Rechnerstart startet `systemd` ebenfalls die Timer-Unit `anacron.timer` mit einer Laufdauer von 1 Stunde und diese Zeitstufe startet periodisch `anacron` über die Unit `anacron.service`, allerdings nur nach 07 Uhr und nur, wenn der Rechner über das Stromnetz versorgt wird. Anacron überprüft anhand seiner eigenen Konfigurationsdateien, ob seit seinem vorherigen Aufruf neue Aufgaben zur Ausführung anstehen und startet solche. Die Konfigurationsdateien zur Definition der Aufgaben (die "Crontabs") befinden sich an unterschiedlichen Orten im Dateisystem und haben auch unterschiedliche [#Formate Formate]: * '''/etc/crontab''': Dies ist die Haupttabelle für auszuführende Cron-Jobs aus Sicht des Systems. Sie wird vom [:Administrator:] des Systems gepflegt. * '''/etc/cron.d/''': In diesem Ordner können zusätzliche Dateien abgelegt werden, die gleichrangig zur Haupttabelle, aber unabhängig von dieser abgearbeitet werden; d.h.u.a. Definitionen von Umgebungsvariablen aus der Haupttabelle gelten nicht in diesen Nebentabellen. Diese Nebentabellen haben dasselbe Format wie die Haupttabelle. Software-Pakete, welche Cron benutzen, legen in diesem Ordner ihre spezielle Konfiguration ab. * '''/var/spool/cron/crontabs/''': In diesem Ordner kann jeder Benutzer auch ohne Root-Rechte[2] eine benutzerspezifische Tabelle ablegen; dies macht man mit dem speziellen Programm '''crontab'''. Auch der Benutzer [:root:] kann sich eine solche benutzerspezifische crontab definieren, diese ist aber __nicht__ die oben aufgeführte Haupttabelle! Das Format dieser benutzerspezifischen Tabellen ist angelehnt an das Format der Haupttabelle, es fehlt aber ersatzlos die Spalte für den Benutzer, da sich dieser bereits aus dem Dateinamen ergibt. * '''/etc/cron.hourly/''': Dieser Ordner enthält ausführbare Programme, welche von Cron für den Benutzer `root` einmal stündlich gestartet werden. Diese Dateien und auch die im folgenden Punkt werden ignoriert, wenn sie bestimmte Anforderungen nicht erfüllen. -> [#Datei-wird-ignoriert Datei wird ignoriert] * '''/etc/cron.daily/''', '''/etc/cron.weekly/''', '''/etc/cron.monthly/''': Diese Ordner enthalten ausführbare Programme, welche entweder von Cron oder Anacron einmal pro jeweiliger Periode gestartet werden. Bei Ubuntu startet Cron diese Programme per Konfiguration nicht, solange Anacron installiert ist. * '''/etc/anacrontab''': Dies ist die (einzige) Tabelle für auszuführende Anacron-Jobs. Sie wird vom [:Administrator:] des Systems gepflegt. Bei Ubuntu enthält sie standardmäßig Startbefehle für die Programme in den im vorstehenden Punkt genannten Ordnern. {{{#!vorlage Tabelle <-4 tableclass="zebra_start3" rowclass="titel" :>Tabelle 1: Übersicht Crontabs +++ Datei Ausführung durch Bearbeitung durch Ausführung als +++ '''/etc/crontab'''[[BR]]'''/etc/cron.d/*''' cron root Benutzer lt. Aufgabenzeile +++ '''/var/spool/cron/crontabs/*''' cron Benutzer lt. Dateiname Benutzer lt. Dateiname +++ '''/etc/cron.hourly/''' cron root root +++ '''/etc/cron.daily/'''[[BR]]'''/etc/cron.weekly/'''[[BR]]'''/etc/cron.monthly/''' anacron (ersatzweise cron) root root +++ '''/etc/anacrontab''' anacron root root }}} Die Datei '''/etc/crontab''' und ihre Schwestern im Ordner '''/etc/cron.d/''' erlauben also die Ausführung eines Jobs im Namen und mit den Rechten eines Benutzers, wobei der Job nicht vom Benutzer verändert werden kann. Dies ist besonders nützlich, wenn Server, die ihren eigenen Benutzer haben, wie z.B. Apache mit www-data, über Cron-Jobs gesteuert werden sollen. Oder wenn man für Benutzer Jobs anlegen möchte, die der Nutzer jedoch selber nicht verändern können soll. Details zur Arbeitsweise von Anacron siehe späteren Abschnitt: -> [#Details-zu-Anacron Details zu Anacron] Cron wie Anacron versenden standardmäßig Ausgaben der Cron-Jobs auf `stdout` und `stderr` sowie Fehlermeldungen per [:Mailserver-Einführung:E-Mail], was bei Ubuntu standardmäßig nicht funktioniert. -> [#Nachricht-von-Cron Nachricht von Cron] = Formate = Dieses Kapitel beschreibt die Dateiformate der Crontabs. Jede Crontab ist eine Textdatei. Möglich sind diese Zeilen; jede muss mit einem Zeilenvorschub (Linefeed, ASCII 012) enden: * Leerzeilen enthalten gar nichts oder nur Leerzeichen und Tabulatoren. Sie werden ignoriert. * Kommentarzeilen beginnen in der ersten Spalte mit einem `#` und können beliebigen Text enthalten. Werden auch ignoriert. * Definitionen für [:Umgebungsvariablen:] haben die Form „`Name = Wert`“. Leerzeichen vor und nach dem Gleichheitszeichen sind möglich, aber optional und werden ignoriert. Die Zeichenfolge für `Wert` wird wörtlich genommen, es erfolgt insbesondere keine Ersetzung von Variablen. Wenn man führende oder nachfolgende Leerzeichen für wichtig hält, muss man die gesamte Zeichenfolge in sonst optionale einfache oder doppelte Anführungszeichen setzen. Die so definierten Umgebungsvariablen werden allen später in der Datei genannten Programmen als Programmumgebung mitgegeben. * Für Aufgabenzeilen (Cron-Jobs) gibt es bei Cron zwei Formate: * Das Grundformat besteht aus sieben bzw. sechs Feldern. Die ersten fünf dienen der Zeitangabe (Minute, Stunde, Tag, Monat, Wochentag) für einen Cron-Job, dann folgt (nur in der systemweiten Crontab) der Benutzername, unter dem der Befehl ausgeführt werden soll, und das letzte Feld enthält den Befehl. Die einzelnen Felder werden durch Leerzeichen oder Tabulatoren getrennt. * Beim alternativen Format werden nur drei bzw. zwei Felder verwendet indem an Stelle der fünf Felder der Zeitangabe nur ein Feld mit einem Schlüsselwort steht. * Aufgabenzeilen für Anacron (Anacron-Jobs) enthalten vier durch Leerzeichen oder Tabulatoren voneinander getrennte Felder. In Aufgabenzeilen definiert das letzte Feld bei allen Formaten das zu startende Programm oder Skript inkl. der benötigten Parameter und ggf. [:Shell/Umleitungen:Umleitungen für Ausgaben]. [[Anker( Prozentzeichen ) ]] {{{#!vorlage Hinweis Das Zeichen % hat in Crontabs eine besondere Bedeutung: Es wird von Cron in einen Zeilenvorschub umgewandelt. Wenn dies nicht erwünscht ist, muss man es sorgfältig durch Quotierung davor schützen. -> [#Prozentzeichen-zerlegt-Crontab Prozentzeichen zerlegt Crontab] }}} Andere als die zuvor beschriebenen Zeilen sind unzulässig; Cron versteht auch keine Fortsetzungszeile durch das Zeichen \ am Ende der vorherigen Zeile und auch keine Kommentare am Zeilenende. [[Anker( Zeilenvorschub ) ]] {{{#!vorlage Hinweis Jede Zeile in einer Crontab muss aus technischen Gründen (ähnlich wie bei der [:fstab:]) mit einen Zeilenvorschub (Linefeed, ASCII 012) enden. Es ist gute Praxis, eine Crontab mit einem Kommentar abzuschließen. Falls man bei dieser Zeile den Zeilenvorschub vergisst, meldet zwar Cron einen Fehler, was ihn aber nicht von der Arbeit abhält. }}} Die offizielle Dokumentation der Crontabs findet man in den [:Manpages:]: {{{#!vorlage Befehl man 5 crontab man anacrontab }}} == Cron-Jobs in Systemtabellen == Dies betrifft die Aufgabenzeilen in der Datei '''/etc/crontab''' und in den Dateien im Ordner '''/etc/cron.d/'''. === Grundformat === Beim Grundformat enthalten Aufgabenzeilen genau 7 Felder. Die ersten fünf Felder spezifizieren die geplante Ausführungszeit gemäß [#Tabelle1 Tabelle 1], das sechste Feld enthält den Namen eines Benutzers aus der Datei '''/etc/passwd'''. Jeder bekannte Benutzer kann hier eingesetzt werden, auch Systembenutzer inkl. `root`. Ein von Cron gestartetes Programm wird mit [:Rechte:Rechten] dieses Benutzers in einer durch die Crontab beschriebenen Programmumgebung ausgeführt. {{{ 1 2 3 4 5 (6) L | | | | | | | | | | | | | +----- Befehl der ausgeführt werden soll | | | | | +------ (Benutzer/Besitzer des Jobs) | | | | | | | | | +----- Wochentag (0 - 7) (Sonntag ist 0 und 7; oder Namen, siehe unten) | | | +------- Monat (1 - 12; oder Namen, siehe unten) | | +--------- Tag (1 - 31) | +----------- Stunde (0 - 23) +------------- Minute (0 - 59) }}} [[Anker( Tabelle2 ) ]] {{{#!vorlage Tabelle <-3 tableclass="zebra_start3" rowclass="titel" :>Tabelle 2: Spezifikation der Ausführungszeit +++ Spalte Verwendung Mögliche Angaben +++ <:>1 Minute * einzelne Zahl im [#Anm1 Bereich] 0-59 oder [#Anm1 Teilbereich] davon oder das Zeichen „`*`“ für „jede Minute“[[BR]] * Liste mit durch Kommata getrennten Zahlen oder Bereichen[[BR]] * Bereich direkt gefolgt von „`/`“ und einer weiteren Zahl -> [#Anm3 Anmerkung 3] +++ <:>2 Stunde * einzelne Zahl im Bereich 0-23 oder Teilbereich davon oder das Zeichen „`*`“ für „jede Stunde“[[BR]] * Liste mit durch Kommata getrennten Zahlen oder Bereichen[[BR]] * Bereich direkt gefolgt von „`/`“ und einer weiteren Zahl +++ <:>3 Tag * einzelne Zahl im Bereich 1-31 oder Teilbereich davon oder das Zeichen „`*`“ für „jeden Tag“[[BR]] * Liste mit durch Kommata getrennten Zahlen oder Bereichen[[BR]] * Bereich direkt gefolgt von „`/`“ und einer weiteren Zahl +++ <:>4 Monat * einzelne Zahl im Bereich 1-12 oder Teilbereich davon oder das Zeichen „`*`“ für „jeden Monat“[[BR]] * Liste mit durch Kommata getrennten Zahlen oder Bereichen[[BR]] * Bereich direkt gefolgt von „`/`“ und einer weiteren Zahl[[BR]] * [#Anm5 engl. Name eines Monats] oder dessen Abkürzung, auch als Liste +++ <:>5 Wochentag * einzelne Zahl im Bereich 0-7 oder das Zeichen „`*`“ für „jeden Wochentag“, Sonntag ist wahlweise `0` oder `7`[[BR]] * Liste mit durch Kommata getrennten Zahlen oder Bereichen[[BR]] * Bereich direkt gefolgt von „`/`“ und einer weiteren Zahl[[BR]] * [#Anm5 engl. Name eines Tages] oder dessen Abkürzung, auch als Liste und in Bereichsangaben -> [#Anm6 Anmerkung 6] }}} Anmerkungen: 1. [[Anker( Anm1 ) ]]Bereiche bzw. Teilbereiche sind zwei durch einen Bindestrich getrennte Zahlen (die mit zum definiertzen Bereich gehören) aus dem jeweiligen Gesamtbereich. Wenn die zweite Zahl kleiner als die erste ist, so wird das als leere Menge verstanden und ein Cron-Job mit einer solchen Angabe wird niemals ausgeführt. 1. Das Zeichen „`*`“ steht jeweils für den zulässigen Gesamtbereich. 1. [[Anker( Anm3 ) ]]Angaben mit Bruchstrich nennen als Zähler den Bereich, als Nenner die Schrittweite. Beispiele: * Minutenangabe `5-59/10` steht für: `5,15,25,35,45,55` * Stundenangabe `*/2` steht für „alle 2 Stunden“, also `0,2,4,6, … 20,22` * Stundenangabe `6-23/4` steht für „alle 4 Stunden ab (einschließlich) 06 Uhr“, also: `6,10,14,18` 1. Einzelwerte kann man mit Listen mischen: `3,18-22,9-13/2` steht für: `3,9,11,13,18,19,20,21,22` 1. [[Anker( Anm5 ) ]]Für die Wochentage und die Monate können die drei ersten Buchstaben des englischen Namen benutzt werden, z. B. `Sun` für Sonntag. Groß-/Kleinschreibung spielt dabei keine Rolle. * Zulässige Namen für Wochentage: `sun, mon, tue, wed, thu, fri, sat`. \\ Beachte: Es wird zwar `7` synonym zu `0` als Sonntag verstanden, aber umgekehrt ist `sun` immer `0` und niemals `7`! Wochentage können in Bereichen wie z.B. `tue-thu` verwendet werden, aber `fri-sun` wird als `5-0` verstanden und ist somit leer. Statt fehlerhafter Angaben wie `fri-mon` (beabsichtigte Lesung: Freitag bis Montag) kann man `fri-sat,sun-mon` oder `fri,sat,sun,mon` verwenden. * Zulässige Monatsnamen: `jan, feb, mar, apr, may, jun, jul, aug, sep, oct, nov, dez` 1. [[Anker( Anm6 ) ]]Tagesangaben und Wochentage gleichzeitig (d.h. beide sind verschieden von `*`) sind tückisch: * "`0 0 13 * fri`" steht __nicht__ für „nur am Freitag, dem 13.“, sondern für „am 13. __und__ allen Freitagen“ * Aber "`0 0 */12 * fri`" steht für „am Freitag, dem 1. und am Freitag, dem 13. und am Freitag, dem 25.“ * Aber "`0 0 1-31/12 * fri`" steht für „am 1. und am 13. und am 25. und allen Freitagen“ === Alternatives Format === Zur Vereinfachung können die ersten fünf Felder auch durch eine einzelne Zeichenkette ersetzt werden. Hierfür sind acht Schlüsselwörter definiert: [[Anker( Tabelle3 ) ]] {{{#!vorlage Tabelle <-4 tableclass="zebra_start3" rowclass="titel" :>Tabelle 3: Alternative Spezifikation der Ausführungszeit +++ Abkürzung Bedeutung ausführliche Schreibweise Hinweise +++ `@reboot` einmalig, beim Start Bedeutet exakt: Wann Cron gestartet wurde. Da dies durch systemd beim Systemstart erfolgt, sind möglicherweise noch nicht alle benötigten Komponenten für die Cron-Jobs verfügbar und es ergeben sich unerwartete oder unerwünschte Resultate. Daher sollte man besser dieses Schlüsselwort vermeiden und den Job über eine Service-Unit von systemd starten, denn diese sind bzgl. ihrer Abhängigkeiten von anderen Prozessen präzise planbar. +++ `@hourly` einmal pro Stunde 0 * * * * Wenn der Job nicht präzise am Anfang jeder Stunde gestartet werden muss, kann dies auch über ein Programm im Ordner '''/etc/cron.hourly''' realisiert werden. +++ `@midnight` einmal pro Tag 0 0 * * * +++ `@daily` einmal pro Tag 0 0 * * * Wenn der Job nicht präzise um Mitternacht gestartet werden muss, kann dies alternativ auch als Anacron-Job realisiert werden. +++ `@weekly` einmal pro Woche 0 0 * * 0 Wenn der Job nicht präzise um Sonntag Mitternacht gestartet werden muss, kann dies alternativ auch als Anacron-Job realisiert werden. +++ `@monthly` einmal im Monat 0 0 1 * * Wenn der Job nicht präzise an jedem ersten des Monats um Mitternacht gestartet werden muss, kann dies alternativ auch als Anacron-Job realisiert werden. +++ `@annually`[[BR]]`@yearly` einmal im Jahr 0 0 1 1 * }}} == Cron-Jobs in Benutzertabellen == Dies betrifft die Aufgabenzeilen in den mit dem Programm '''crontab''' zu bearbeitenden Dateien im Ordner '''/var/spool/cron/crontabs/'''. Beim Grundformat enthalten Aufgabenzeilen genau 6 Felder. Die ersten fünf Felder spezifizieren die geplante Ausführungszeit gemäß [#Tabelle2 Tabelle 2]. Der Benutzer für die Cron-Jobs wird nicht in der Crontab selbst notiert, sondern ergibt sich aus den Dateinamen. Ein von Cron gestartetes Programm wird mit [:Rechte:Rechten] dieses Benutzers in einer durch die Crontab beschriebenen Programmumgebung ausgeführt. Es kann auch ein alternatives Format mit zwei Feldern verwendet werden. Im ersten Feld stehen Zeitangaben lt. [#Tabelle3 Tabelle 3]. [[Anker( Beispiel-Crontab ) ]] Hier ein Beispiel für die Crontab eines Benutzers mit Erläuterungen: {{{#!code text # Umgebungsvariablen PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin SHELL=/bin/bash MAILTO='' #M S T M W Befehl #----------------------------------------------------------------- 5 9-20 * * * $HOME/script/script1.sh > /dev/null */10 * * * * /usr/bin/script2.sh > /dev/null 2>&1 59 23 * * 0,4 cp QUELLDATEI ZIELDATEI 00 22 * * mon-fri DISPLAY=:0 LANG=de_DE.UTF-8 zenity --info --text "Ende der Arbeitszeit!" @midnight backup 0 1 8-14 * * [ "$(date +\%u)" = 6 ] && Befehl # Das ist das Ende! }}} * Zeile 1: Für die Crontab eines Benutzers werden standardmäßig die [:Umgebungsvariable:Umgebungsvariablen] `HOME, LANG, LOGNAME, PATH, PWD und SHELL` gesetzt, allerdings teilweise auf andere Werte als üblich: * `HOME` und `PWD` bezeichnen das [:Benutzerverzeichnis:]. * `LANG` identifiziert die Sprache des Systems, __nicht__ die ggf. vom Benutzer für sich eingestellte Sprache. * `LOGNAME` ist der Dateiname der Crontab, dieser entspricht dem zum Zeitpunkt der Erstellung der Datei gültigen Wert für `USER`, aber `USER` selbst ist nun nicht gesetzt! * `PATH=/usr/bin:/bin` * `SHELL=/bin/sh` * Zeilen 2,3 setzen die vertrauten Werte für `PATH` und `SHELL`. * Zeile 4 verhindert sinnlose Versuche, E-Mail ohne funktionierendes E-Mail-System zu versenden. -> [#Nachricht-von-Cron Nachricht von Cron] * Zeile 7-12: Cron-Jobs mit Ausführungszeiten: 1. Fünf Minuten nach jeder vollen Stunde zwischen 09 und 20 Uhr (also 09:05, 10:05, ..., 20:05). Beachte: In Aufgabenzeilen kann man für den Befehl Variablen (hier: `HOME`) verwenden, sofern diese in derselben Crontab definiert wurden; lediglich in den Definitionen für die Umgebungsvariablen funktioniert das nicht. 1. Alle 10 Minuten: Beachte: Im Befehl müsste der Pfad für das Skript (hier: `/usr/bin/`) nicht angegeben werden, da er ja in Zeile 2 in der Variablen `PATH` steht. 1. Jeden Sonntag und Donnerstag um 23:59 1. Jeden Wochentag um 22:00 Uhr ein Programm mit GUI, das die Display- und die Sprach-Variable benötigt. (Das funktioniert so nicht zuverlässig und gar nicht unter Wayland! -> [#GUI-Programm-funktioniert-nicht GUI.Programm funktioniert nicht]) 1. Jeden Tag Punkt Mitternacht 00:00 Uhr 1. Jeden 2. Samstag im Monat um 01:00 Uhr. Beachte, dass die Einschränkung auf Samstag durch den auszuführenden Befehl erfolgt und die eingestellte Shell diese Syntax unterstützen muss und das [#Prozentzeichen Zeichen `%`] sorgfältig vor einer Interpretation durch Cron geschützt werden muss! * Zeile 13: Abschluss der Datei per Konvention mit einem Kommentar verhindert Fehler durch eine eventuell in der vorherigen Zeile vergessene Zeilenschaltung. == Anacron-Jobs == Dies betrifft die Aufgabenzeilen in der Datei '''/etc/anacrontab'''. {{{ 1 2 3 L | | | | | | | +----- Befehl der ausgeführt werden soll | | | | | +----- job-identifier (Datei für den Zeitstempel) | +----- delay (Zeitverzögerung nach Systemstart in Minuten) +----- period (Zeit in Tagen) }}} {{{#!vorlage Tabelle <-3 tableclass="zebra_start3" rowclass="titel" :>Tabelle 4: Felder in /etc/anacrontab +++ Feld Bedeutung Mögliche Werte/Hinweise +++ period Periode der Jobausführung in Tagen 1 oder größere ganze Zahl oder `@monthly`. Beispiele:[[BR]] * 1 – täglich[[BR]] * 7 – alle 7 Tage, also wöchentlich[[BR]] * 30 – ungefähr monatlich, exakt alle 30 Tage[[BR]] * `@monthly` – monatlich +++ delay Wartezeit des Jobs in Minuten nach Start von Anacron 0 oder größere ganze Zahl: In der Praxis kann man damit verhindern, dass alle Jobs zugleich laufen und man kann Jobs mit der gleichen Periode in eine Reihenfolge zwingen. +++ job-identifier Dateiname für den Zeitstempel dieses Jobs Jeder Job muss einen exklusiv von ihm benutzten Dateinamen haben. Hier wird die letzte Laufzeit des Jobs gespeichert; Anacron benötigt diese Information, damit der Job innerhalb der Periode nur einmal ausgeführt wird. Dieser Name wird auch zur Identifizierung der Jobs im Systemlog verwendet. +++ command Befehl oder auszuführendes Skript }}} Die Standardeinstellungen in '''/etc/anacrontab''' am Beispiel von [:jammy:Ubuntu 22.04]: {{{#!code text # /etc/anacrontab: configuration file for anacron # See anacron(8) and anacrontab(5) for details. SHELL=/bin/sh PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin HOME=/root LOGNAME=root # These replace cron's entries 1 5 cron.daily run-parts --report /etc/cron.daily 7 10 cron.weekly run-parts --report /etc/cron.weekly @monthly 15 cron.monthly run-parts --report /etc/cron.monthly }}} * Zeile 1: Anacron definiert standardmäßig die [:Umgebungsvariable:Umgebungsvariablen] `ANACRON_ARGS` und `ANACRON_RUN_ON_BATTERY_POWER` (generelle Startparameter), dann `INVOCATION_ID` und `JOURNAL_STREAM` (Kennzeichen von systemd für den momentanen Aufruf), sowie setzt `LANG, PATH, und PWD`, allerdings teilweise auf andere Werte als üblich: * `LANG` identifiziert die Sprache des Systems, __nicht__ die ggf. vom Benutzer für sich eingestellte Sprache. * `PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin` (Dieser Wert ist erkennbar von System abhängig und kann daher auch anders lauten!) * `PWD=/` * Zeilen 5-8 setzen `SHELL` und `PATH` auf die vertrauten Werte sowie `HOME` und `LOGNAME` wie bei Cron. * Zeile 11-13: Anacron-Jobs mit Perioden: 1. Täglich einmal werden die Programme im Ordner '''/etc/cron.daily/''' gestartet, 1. wöchentlich einmal die im Ordner '''/etc/cron.weekly/''' und 1. monatlich einmal die im Ordner '''/etc/cron.monthly/'''. Dafür wird jeweils das Programm [#Datei-wird-ignoriert run-parts] eingesetzt. Weitere Umgebungsvariablen können bei Bedarf hinzugefügt werden. Da Anacron sich bezüglich des Versendung von E-Mails analog wie Cron verhält, ist auch hier eine Zeile "`MAILTO = ''`" sinnvoll, sofern man kein E-Mail-System installiert hat. Eigene Anacron-Jobs kann man auch mit anderen Perioden in dieser Datei definieren oder mit mit den bekannten Perioden in den Ordnern als Programm hinterlegen. = Crontab bearbeiten = Man bearbeitet eine Crontab mit einem [:Editor:Texteditor] seiner Wahl. Wenn man eine graphische Desktop-Umgebung benutzt, darf das auch ein GUI-Programm wie beispielsweise [:gedit:] sein. Man muss allerdings beachten, dass es sich in allen Fällen um Systemdateien handelt, welche mit besonderen Prozeduren bzw. mit Root-Rechten[2] bearbeitet werden müssen. 1. Zur Bearbeitung der Crontabs im Desktop per GUI-Editor benötigt man nur eine [:.desktop-Datei:Desktop-Datei] für `sudoedit` und `crontab`; eine geeignete kann man aus einem Anhang dieses Artikels herunterladen und wie jede andere Desktop-Datei installieren: [:Cron/UU.crontab.desktop:] ## Link in vorstehender Zeile vor Freigabe korrigieren auf [:Cron/UU.crontab.desktop:] und nach Einrichtung einer Baustelle auf [:Beustelle/Cron/UU.crontab.desktop:]!! 1. [[Bild(kcron.png, 200, right)]] Alternativ: Unter KDE gibt es für diese Aufgabe das Paket '''kde-config-cron'''. Das Programm ist Teil des [:KDE_Software_Compilation#KDE-Komponenten: KDE Metapakets] '''kdeadmin'''. Nach der Installation findet man es unter * ''"Systemeinstellungen -> Systemverwaltung -> Aufgabenplaner"'' 1. Alternativ kann man ein Terminal[1] öffnen: * Zur Bearbeitung der Datei '''/etc/crontab''', der Dateien im Ordner '''/etc/cron.d/''' oder der Datei '''/etc/anacrontab''' wird [:mit_Root-Rechten_arbeiten/#Systemdatei-mit-Editor-bearbeiten:dieser Befehl] empfohlen: [[Vorlage(Befehl, "EDITOR=gedit sudoedit DATEI" ) ]] Hier kann man anstelle `gedit` seinen bevorzugten Editor einsetzen und man muss `DATEI` durch den konkreten Dateinamen ersetzen. * Zur Bearbeitung der Crontab eines Benutzers meldet man sich als dieser Benutzer an oder wechselt seine Identität zu diesem Benutzer und verwendet diesen Befehl: [[Vorlage(Befehl, "EDITOR=gedit crontab -e" ) ]] Hier kann man anstelle `gedit` seinen bevorzugten Editor einsetzen, und man gibt keinen Dateinamen an, da dieser automatisch und nicht änderbar durch '''/var/spool/cron/crontabs/$USER''' vorgegeben ist. [[Vorlage(Warnung, "Die Verwendung des Programms `crontab` ist verpflichtend bei der Bearbeitung dieser Datei, da spezielle Rechte gesetzt werden müssen und es wegen des Zugriffs des laufenden Dienstes Cron auf diese Datei sonst zu Störungen kommen kann." ) ]] Dokumentation des Programms `crontab`: [[Vorlage(Befehl, "man 1 crontab" ) ]] = Details zum Programm crontab = Dieser Abschnitt ist nur relevant für Benutzer, welche keinen Desktop verwenden und somit einen Editor für die Kommandozeile einsetzen müssen. Alternativ zum oben beschriebenen [#Crontab-bearbeiten Aufruf mit Angabe des Editors] kann man auch `crontab` in einem Terminal[1] bzw. virtuellen Console (VCS) ohne eine solche Angabe aufrufen. Das Programm verwendet dann den in der versteckten Datei '''~/.selected_editor''' im [:Homeverzeichnis:Benutzerordner] vermerkten Editor. Falls eine solche Datei nicht existiert, wird man zur Auswahl eines Editors aus den im System verfügbaren aufgefordert: {{{#!vorlage Befehl crontab -e }}} Zeigt Auswahldialog, wenn noch kein Editor festgelegt wurde: {{{ no crontab for BENUTZERNAME - using an empty one Select an editor. To change later, run 'select-editor'. 1. /bin/ed 2. /bin/nano <---- easiest 3. /usr/bin/jmacs 4. /usr/bin/joe 5. /usr/bin/jpico 6. /usr/bin/jstar 7. /usr/bin/rjoe 8. /usr/bin/vim.tiny Choose 1-8 [2]: }}} Der ausgewählte Editor wird in o.g. Datei gespeichert. Möchte man die getroffene Entscheidung später wieder ändern, löscht man diese Datei oder benutzt wie angegeben den Befehl: {{{#!vorlage Befehl select-editor }}} Alternativ – falls man den Editor nur für die aktuelle Bearbeitung ändern möchte – kann dieser auch direkt angegeben werden (hier am Beispiel von [:VIM:]): {{{#!vorlage Befehl EDITOR=vim.tiny crontab -e }}} Besaß der Benutzer bisher noch keine Crontab, so enthält die Datei nur ein paar Kommentare. Natürlich kann auch root eine Crontab anlegen. Alle Cron-Jobs, die in dieser Tabelle stehen, werden mit Root-Rechten[2] ausgeführt: {{{#!vorlage Befehl sudo crontab -e }}} [[Anker(anacron)]] = Details zu Anacron = Cron startet einzelne Jobs immer nur zu den in den Crontabs eingetragenen Zeitpunkten. Ein Cron-Job, der beispielsweise täglich um 18:00 Uhr ausgeführt werden soll, wird an diesem Tag nur ausgeführt, wenn der Rechner um Punkt 18 Uhr in Betrieb ist. Für regelmäßig auszuführende Jobs bei nicht durchgehend laufendem Rechner ist Cron daher nicht ideal. Wenn man Pech hat, wird z.B. eine wichtige Datensicherung ("backup") verpasst. Cron wird daher bei Ubuntu durch das Programm Anacron ergänzt. Der Name Anacron ist eine Verkürzung von ''"Anac(h)ronistic Cron"'', also ein „Cron ähnliches Programm, welches sich nicht nach dem aktuellen Zeitpunkt richtet“. Für einen Anacron-Job wird statt eines Ausführungszeitpunktes eine Zeitdauer in Tagen definiert, innerhalb deren der Job genau einmal gestartet werden soll. Anacron erfordert nicht das kontinuierliche Laufen des Systems, sondern nur gelegentliches Einschalten und prüft bei jedem Start jeden seiner Jobs, wann er zuletzt lief und startet ihn erneut, wenn dies länger als die dem Job zugewiesene Periode zurück liegt. Neben der bereits beschriebenen Definition von Anacron-Jobs in der Jobliste '''/etc/anacrontab''' gibt es noch ein alternatives Verfahren: Anacron kann mit seiner Standard-Konfiguration zum Ausführen von täglich, wöchentlich oder monatlich anstehenden Aufträgen verwendet werden, da seine Jobliste '''/etc/anacrontab''' bereits entsprechende Anacron-Jobs enthält. Das auszuführende Skript oder Programm muss nur in das entsprechende Verzeichnis als ausführbare Datei kopiert oder verlinkt werden: ## * '''/etc/cron.hourly/''' - stündlich von Cron auszuführen * '''/etc/cron.daily/''' - täglich auszuführen * '''/etc/cron.weekly/''' - wöchentlich auszuführen * '''/etc/cron.monthly/''' - monatlich auszuführen Die Namen der Verzeichnisse sprechen für sich. Am besten schaut man sich kurz die Skripte in diesen Verzeichnissen an, bevor man selber dort etwas ablegt. Alle Programme in einem dieser Ordner bilden zusammen einen Anacron-Job. Die Dateien in den Ordnern werden mittels run-parts gestartet und unterliegen deshalb [#Datei-wird-ignoriert Einschränkungen]. Anacron wird bei Ubuntu von systemd über die Datei '''/lib/systemd/system/anacron.timer''' jede Stunde gestartet, es bestehen aber Einschränkungen: * Solange ein Laptop im Batteriebetrieb läuft, wird Anacron auf diesem nicht gestartet. * Im Zeitraum 00-07 Uhr wird Anacron nicht gestartet. Diese Einschränkungen kann man in der Unit-Datei für den Timer kontrollieren und können durch teilweises oder vollständiges Überlagern der Unit-Dateien verändert werden; man benutze dazu folgende Befehle (entsprechend auch auf `anacron.service`): {{{#!vorlage Befehl systemctl cat anacron.timer sudo systemctl edit anacron.timer sudo systemctl --full edit anacron.timer }}} = Nachricht von Cron = Cron und Anacron schicken die Ergebnisse (also Ausgaben auf `stdout` und `stderr`) und auch sonstige Fehlermeldungen während der automatisierten Ausführung eines Jobs an den Benutzer des Jobs per E-Mail. {{{#!vorlage Hinweis Dies setzt allerdings die Funktion eines MTA ("Mail Transfer Agent") wie beispielsweise [:Postfix:] voraus. Bei Ubuntu ist diese Voraussetzung standardmäßig nicht erfüllt. Man kann einen MTA selbst installieren und konfigurieren oder sollte in den Crontabs die Umgebungsvariable "`MAILTO = ''`" setzen, was dann die Versendung von E-Mails unterdrückt. }}} Die Ausgaben eines Jobs, sofern man keine Versendung per E-Mail wünscht, kann man auch durch Umleitung nach '''/dev/null''' entsorgen. Wenn ein Job keine Ausgabe auf `stdout` und `stderr` erzeugt und auch keinen Fehler zurückmeldet, dann wird auch keine E-Mail verschickt. Verschickt werden E-Mails durch einen Aufruf des Programms '''/usr/sbin/sendmail''', sofern ein solches exitiert. Das Programm erhält beim Aufruf die Argumente `"-FCronDaemon -i -B8BITMIME -oem BENUTZER"` und die zu verschickende E-Mail von `stdin`. BENUTZER ist der Benutzer des Cron-Jobs oder der Wert der Umgebungsvariablen `MAILTO`. Auch der Aufruf von `sendmail` erfolgt mit Namen und mit den Rechten des Besitzers des Cron-Jobs. Mit der Variable `MAILTO` kann ein (1!) anderer Empfänger für die Benachrichtigungen unabhängig vom Besitzer der Cron-Tabelle festgelegt werden (`MAILTO=irgendwer`). Der Besitzer des Jobs erhält dann keine E-Mails von Cron bzw. Anacron. = Anwendungsbeispiele = == Erreichbarkeit eines Servers testen == Ein Server (als Beispiel: `192.168.0.1`) soll periodisch überprüft werden, ob dieser online ist. Hierzu wird ein Cron-Job des Systems definiert, der alle fünf Minuten ein [:Ping:] an den Rechner geschickt. Ein erfolgreicher Ping ist uninteressant, im Falle eines Fehlers sollte jedoch der Cron-Job eine E-Mail mit dem Ergebnis des gescheiterten Pings ausgeben. Dies erreicht man, indem die Standardausgabe an '''/dev/null''' umleitet. Fehlermeldungen werden aber -- wie gewünscht -- per E-Mail verschickt, das positive Ergebnis verworfen. {{{ */5 * * * * root ping -c 1 192.168.0.1 >/dev/null }}} Auf Rechner ohne E-Mail-System kann man die Fehlerausgabe `stderr` in das [:Logdateien:Systemlog] umleiten oder auch dem [:Benachrichtigungsdienst:] eines laufenden Desktops übergeben: {{{ */5 * * * * root ping -c 1 192.168.0.1 1>/dev/null 2>&1 | logger }}} == Internetverbindung aufrecht erhalten == Wenn man gar nicht an den Ausgaben des Cron-Jobs interessiert ist, weil es nur auf die Nebeneffekte ankommt, vernichtet man am besten jegliche Ausgabe des Cron-Jobs. Beispielsweise beim regelmäßigen Ping an eine Internetadresse, um zu verhindern, dass die Dial-Up-Verbindung getrennt wird: {{{ */5 * * * * root ping -c 1 www.google.de 1>/dev/null 2>/dev/null }}} = Problembehebung = Wenn es nicht wie vorgesehen funktioniert, kann man diese Checkliste zur Fehlersuche verwenden: 1. Wurde Cron beim Start des Systems überhaupt gestartet und läuft noch?\\ Kontrolle über: [[Vorlage(Befehl, "systemctl status cron.service" ) ]] 1. Wird Anacron periodisch jede Stunde gestartet?\\ Kontrolle über : [[Vorlage(Befehl, "systemctl status anacron.timer" ) ]] und : [[Vorlage(Befehl, "systemctl status anacron.service" ) ]] 1. Cron und Anachron melden den Start jeden Jobs im Systemlog. Dieses kann man mit folgenden Befehlen durchsehen, ob überhaupt ein Start des vermissten/fehlerhaften Jobs erfolgt: * [[Vorlage(Befehl, "journalctl -b -u cron.service" ) ]] * [[Vorlage(Befehl, "journalctl -b -u anacron.service" ) ]] * [[Vorlage(Befehl, "journalctl -b | grep CRON | less" ) ]] 1. Die Geschätzigkeit von Cron kann man einstellen. Dazu muss beim Aufruf des Programms die Option `-L` mit einer Zahl `0-15` angegeben werden. Dies kann entweder durch (veraltet) Definition der Variablen `EXTRA_OPTS` in der Datei '''/etc/default/cron''' erfolgen oder (besser) durch [:systemd/systemctl/#Bearbeiten-von-Unit-Dateien:Bearbeitung der Unit] mit dem Befehl: [[Vorlage(Befehl, "sudo systemctl edit cron.service" ) ]] Effektiv ist in der Unit-Datei '''cron.service''' die Zeile {{{ExecStart=/usr/sbin/cron -f -P $EXTRA_OPTS }}} zu ersetzen durch: {{{ExecStart=/usr/sbin/cron -f -P $EXTRA_OPTS -L 15 }}} Zur Bedeutung der Zahlen `0-15` konsultiere die Manpage von Cron. ## 1. [TODO] Die Geschätzigkeit von Anacron kann man einstellen. [Oder auch nicht. Wer es weiß, möge das ergänzen.] 1. Eigene Skripte kann man anweisen, Fehler auf `stdout` oder `stderr` zu schreiben und diese Ströme sollte man auf das Systemlog umleiten. Dies gelingt beim Aufruf des Programms PROGRAMM mit diesem Idiom: [[Vorlage(Befehl, "PROGRAMM 2>&1 | logger -t CRON" ) ]] Wichtig ist hier der Parameter `"-t CRON"`, damit die Ausgaben wiederauffindbar abgelegt werden. 1. Wenn der Job gar nicht gestartet wird, überprüfe man die jeweilige Crontab auf formale und syntaktische Fehler: * [#Besitzer-und-Rechte Besitzer und Rechte] sind richtig gesetzt? * Verbotene Zeichen im Dateinamen? -> [#Datei-wird-ignoriert Datei wird ignoriert] * Crontab endet mit [#Zeilenvorschub Zeilenvorschub] oder Kommentar? -> [#Formate Formate] * Die Crontab enthält [#Prozentzeichen Prozentzeichen (%)]? * Ein trivialer Job wie [[Vorlage(Befehl, "/usr/bin/echo TEST 2>&1 | /usr/bin/logger -t CRON" ) ]] mit derselben Startzeit-Spezifikation startet zeitgerecht? * Wenn nein, dann ist der Fehler in der Startzeit-Spezifikation zu suchen, * im anderen Fall sind vielleicht die Umgebungsvariablen `SHELL` und `PATH` fehlerhaft. * Wenn Programme nicht gefunden werden, kann man sie in der Aufgabenzeile mit ihrem absoluten Pfad angeben. == Unterschiedliches Verhalten eines Befehls/Skripts in Shell und Cron-Job == Dies kann auf nachstehend genannten oder anderen Ursachen beruhen: * Das Skript hat einen fehlerhaften oder falschen [:Shebang:]. * Auf der Kommandozeile und als Cron-Job werden unterschiedliche [:Shell:Shells] benutzt. Dies kann in der Crontab über die Umgebungsvariable `SHELL` angepasst werden. * Im Skript werden benötigte Programme nicht gefunden, weil die Umgebungsvariable `PATH` unterschiedlich gesetzt wurde. * In der Programmumgebung des Cron-Jobs fehlen bestimmte Umgebungsvariablen, welche aber für die Kommandozeile gesetzt sind. Dies kann sowohl bei Kommandozeilen-Programmen vorkommen, betrifft aber in besonderem Maße GUI-Programme. -> [#GUI-Programm-funktioniert-nicht GUI-Programm-funktioniert-nicht] * Die beteiligten Shells arbeiten in unterschiedliechen Arbeitsmodus: * Shells in den grafischen Fenster eines Desktops arbeiten normalerweise als ''„interaktive nicht-login Shell“'', können durch besondere Einstellung aber auch eine ''„interaktive Login-Shell“'' sein. * Shells in virtellen Konsolen sind ''„interaktive Login-Shells“''. * Cron-Jobs laufen unter einer ''„nicht-interaktiven nicht-login Shell“''. Wenn man vermutet, dass die beoachteten Unterschiede auf unterschiedlichem Arbeitsmodus beruht, kann man das Skript anpassen oder in der Crontab das Skript über folgenden Befehl versuchsweise als ''„nicht-interaktive Login-Shell“'' starten: {{{ /bin/bash --login /PFAD-ZUM-SKRIPT/SKRIPT }}} == Prozentzeichen zerlegt Crontab == In einer Crontab hat das Prozentzeichen % eine besondere Bedeutung: Es wird von Cron umgewandelt in einen Zeilenvorschub. Dieses überraschende Verhalten wurde vorgesehen, um einem Cron-Job eine von ihm über `stdin` lesbare Eingabe geben zu können. Details -> [http://www.hcidata.info/crontab.htm Crontab and %] {en} Während auf einer Kommandozeile oder in einem Skript eine Formulierung wie beispielsweise: {{{#!vorlage Befehl echo cron-test1-$(date +"%Y%m%d-%H_%M") >> /tmp/cron-test.txt }}} problemlos Funktioniert, kommt es in einer Crontab zu Fehlern. Als Problemlösung bietet sich an, entweder die Befehle über eigene Skripte auszuführen, oder man setzt vor jedes %-Zeichen einen Backslash '\'. Für obiges Beispiel lautet der entsprechende Eintrag in der crontab dann: {{{ */2 * * * * heinz echo cron-test1-$(date +"\%Y\%m\%d-\%H_\%M") >> /tmp/cron-test.txt }}} == Besitzer und Rechte == Ein Fehler, der auch dazu führen kann, dass die Einträge in einer Crontab nicht ausgeführt werden, sind falsche Besitzer oder Rechte für die Datei. * Die Datei '''/etc/crontab''' soll [:root:] gehören und darf nur von diesem schreibbar sein; sie soll nicht ausführbar sein: \\ {{{ $ls -al /etc/crontab /etc/cron.d/ -rw-r--r-- 1 root root 1138 Sep 14 09:36 /etc/crontab /etc/cron.d/: insgesamt 28 drwxr-xr-x 2 root root 4096 Aug 7 2022 . drwxr-xr-x 137 root root 12288 Okt 25 16:38 .. -rw-r--r-- 1 root root 285 Jul 16 2019 anacron -rw-r--r-- 1 root root 201 Feb 14 2020 e2scrub_all -rw-r--r-- 1 root root 102 Feb 13 2020 .placeholder }}} Dies gilt entsprechend auch für jede Datei im Ordner '''/etc/cron.d/''' und den Ordner selbst. * Die Dateien in den Ordnern '''/etc/cron.hourly/''' usw. müssen dagegen ausführbar sein. -> [#Datei-wird-ignoriert Datei wird ignoriert] * Die Crontab jedes Benutzers (im Beispiel: `userX`) im Ordner '''/var/spool/cron/crontabs/''' muss dagegen dem jeweiligen Benutzer gehören und darf von niemandem außer ihm selbst gelesen oder geschrieben werden können und soll auch nicht ausführbar sein: \\ {{{ $ sudo ls -al /var/spool/cron/crontabs/ insgesamt 12 drwx-wx--T 2 root crontab 4096 Okt 26 06:44 . drwxr-xr-x 3 root root 4096 Aug 20 2021 .. -rw------- 1 userX crontab 1199 Okt 26 06:44 userX }}} Besitzer und Rechte können bei Bedarf mit Root-Rechten[2] mit den Programmen [:chown:] und [:chmod:] korrigiert werden. == Datei wird ignoriert == Die Dateien in den Ordnern '''/etc/cron.hourly/''', '''/etc/cron.daily/''', '''/etc/cron.weekly/''' und '''/etc/cron.monthly/''' werden mittels run-parts gestartet und unterliegen deshalb Einschränkungen: * Sie müssen ausführbar sein. * Der Dateiname darf nur große und kleine Buchstaben, Ziffern, Unterstriche und Bindestriche enthalten; andernfalls wird die Datei ignoriert. Der reguläre Ausdruck "`^[a-zA-Z0-9_-]+$`" definiert exakt alle zulässigen Zeichenfolgen. Punkt und Umlaute sind also beispielsweise nicht erlaubt. == GUI-Programm funktioniert nicht == Cron und Anacron haben von Haus aus keinen Zugriff auf den Desktop bzw. den einem Desktop zugeordneten Bildschirm. Sie sind in erster Linie für Server gedacht, die oftmals an gar keinen Bildschirm angeschlossen sind. Die Ausgabe der Kommandos wird auch nicht auf den Bildschirm geschrieben -- das könnte auch sehr störend sein -- sondern in Logdateien, bzw. in E-Mails, sofern eingerichtet, die an den Benutzer oder Administrator geschickt werden. Das Cron-System hat also keine Kenntnis von grafischen Anzeigeprogrammen wie [:X-Server:Xorg] bzw. [:Wayland:] oder [:Desktopumgebung:Desktopumgebungen] bzw. deren Funktionalitäten. Will man aus einen Cron-Job ein Fenster auf einem Desktop öffnen oder eine andere Funktion (wie z.B. den [:GNOME Schlüsselbund:] oder den [:Benachrichtigungsdienst:]) eines Desktops benutzen, muss man selbst beim Programmaufruf oder im Skript dafür sorgen, dass diese Komponennten im System gefunden werden. In vielen Fällen kann dies durch Setzen geeigneter [:Umgebungsvariable:Umgebungsvariablen] geschehen. Leider gibt es dafür kein allgemein gültiges Rezept, sondern für jeden Desktop und jedes Programm können individuell auch noch von der momentanen Situation abhängige Variablen und Werte erforderlich sein: * Da die Kommunikation mit dem Desktop über [:D-Bus:] erfolgt, benötigt man in vielen Fällen die Umgebungsvariable `DBUS_SESSION_BUS_ADDRESS` des anzusprechenden Desktops. * Wenn der Desktop einen [:X-Server:] benutzt, kann auch die Angabe des Displays über die Umgebungsvariable `DISPLAY` erforderlich sein. Die konkrete Angabe `DISPLAY=:0` hilft in vielen Fällen, ist aber nicht allgemein gültig. * Wenn der Desktop unter [:Wayland:] läuft, kann die Angabe der Umgebungsvariablen `XDG_RUNTIME_DIR` helfen. * Manchmal muss auch noch die Lokalisation eingestellt werden, damit man z.B. deutsche Oberflächen erhält und Umlaute funktionieren. [:Zenity:] verweigert ohne diese Einstellung ggf. sogar komplett den Dienst (siehe auch diese Foren-Posts: [post:2483133:1], [post:2671061:2], [post:2781486:3]): `LANG=de_DE.utf8` * Unter bestimmten Desktopumgebungen wie beispielsweise [:LXDE:] (Lubuntu) oder [:Xfce:] (Xubuntu) ist es nötig, die Umgebungsvariable `XAUTHORITY` auf den richtigen Wert zu setzen. In allen Fällen besteht das Problem, die richtigen Werte für die genannten und weitere Variablen zu ermitteln. Ein mögliches Szenario besteht darin, die Variablen mit ihren aktuellen Werten in einer in einer von Cron auffindbaren Datei (z.B. in einer versteckten Datei im Benutzerordner) zu hinterlegen. Der Cron-Job kann dann auf die entsprechenden Werte zurückgreifen. Man kann diese Werte mit einem Skript abfragen, welches in der Desktop-Umgebung vor dem eigentlichen Aufruf des Cron-Jobs läuft und die aktuellen Werte der Variablen in einer von Cron auffindbaren Datei als [#Links toten Briefkasten] ablegt. Konkret kann man dieses Skript über die [:Autostart:]-Funktion seines Desktops ausführen lassen: {{{#!code bash #!/bin/bash # Exportiere die dbus session address und andere Variablen, damit sie via Cron nutzbar sind. # Diese Datei muss via Autostart ausgeführt werden umask 0600 rm -f $HOME/.kassiber ; touch $_ ; exec >$_ while read VAR do echo "$VAR=${!VAR}" echo "export $VAR" done <<-EOF DBUS_SESSION_BUS_ADDRESS DISPLAY LANG XAUTHORITY EOF }}} Die Liste der Variablen im Here-Dokument ist natürlich an die eigenen Bedürfnisse anzupassen. Bei Start des Cron-Jobs ist dann dieser tote Briefkasten einzusehen. In der Crontab des Benutzers formuliert man dazu den Job z.B. so: {{{ SHELL = /bin/bash 00 22 * * mon-fri . $HOME/.kassiber ; zenity --info --text "Ende der Arbeitszeit!" }}} Der alleine stehende Punkt ist der POSIX-Shell-Befehl `source`. == Zugriff auf GNOME Schlüsselbund ermöglichen == Jobs mit Zugriff auf E-Mail-Konten (beispielsweise Download neuer Nachrichten) benötigen je nach Einrichtung einen Zugriff auf den [:GNOME Schlüsselbund:]. Dazu muss `DBUS_SESSION_BUS_ADDRESS` als Umgebungsvariable gesetzt sein. Man kann das wie im [#GUI-Programm-funktioniert-nicht vorstehenden Abschnitt] lösen. == Cron-Job startet zu falscher Stunde == Die Zeitangaben in den Crontabs werden als relativ zu der in der Datei '''/etc/timezone''' genannten Zeitzone verstanden. Der [:Administrator:] des Systems muss hier die für das System gültige Zeitzone hinterlegen, das kann eine andere als die benutzerspezifische sein! Anacron benötigt ebenfalls eine Angabe zur Zeitzone des Systems, da der Zeitpunkt des Datumswechsels von der Zeitzone abhängt. Anacron bezieht diese Information aber aus andereren Quellen als Cron. Die in der Manpage genannten Methoden scheinen bei Ubuntu __nicht__ realisiert zu sein, daher wird sich Anacron bei der Bestimmung des Tageswechsels vermutlich nach der [wikipedia:Weltzeit:] (UTC, Z-Zeit) richten. Die Zeitzonen `MEZ` bzw. `MESZ` laufen dieser 1 bzw. 2 Stunden voraus. Wenn für System und Benutzer unterschiedliche Zeitzonen definiert sind, muss der Benutzer in seiner Crontab die Zeiten als relativ zur Zeitzone des Systems eintragen. Für die richtige Umschaltung Normalzeit <--> Sommerzeit ist das Paket '''tzdata''' zuständig, welches stets aktuell gehalten werden muss. = Links = * [:Shell/Umleitungen:Umleitungen] -- die Ausgabe von Shell-Befehlen umlenken * [:cron-apt:] -- (Sicherheits-)Updates automatisch herunterladen * [:Incron:] -- Ordner überwachen und Befehle getriggert durch Dateievents ausführen * [https://crontab.guru/ crontab guru] {en} -- crontab-Zeiten in Sprache "übersetzen" * [https://grinux.wordpress.com/2012/04/18/run-anacron-as-user/ Run anacron as user] {en} -- Blogbeitrag, 04/2012 * [https://www.linux-community.de/ausgaben/linuxuser/2006/02/cron-at/ Punktlandung – Cron, At] {de} -- LinuxUser, 02/2006 * [wikipedia:Toter_Briefkasten:toter Briefkasten] * [https://www.stasi-unterlagen-archiv.de/mfs-lexikon/detail/toter-briefkandreas-schmidten-tbk/ Toter Briefkasten (TBK)] {de} – Zur Verwendung toter Briefkästen im realen Leben # tag: System,