Cron

Aus Synology Wiki
Wechseln zu: Navigation, Suche

Der Cron-Daemon ermöglicht es, Scripte und Programme zu genau definierten Zeitpunkten zu starten und ist auf der DS bereits vorinstalliert.

Eine weit verbreitete Anwendung ist das Backup mit rsync oder Rsnapshot, deshalb am Ende ein entsprechendes Beispiel.

Cron konfigurieren

Cron wird konfiguriert durch die Datei crontab, die für jeden Benutzer einzeln angelegt werden kann. Dazu dient der Befehlt crontab -e.

Bei der DS ist das etwas anders, hier gibt es die /etc/crontab, welche nur root bearbeiten darf. Dazu nutzt man am besten das 3rd-Party-App cronjobs oder bearbeitet die Datei direkt mit einem Editor, wie z.B. Vi.

Aufbau von /etc/crontab

Cron-Tabellen bestehen aus beliebig vielen Zeilen. Kommentare werden durch # eingeleitet. Sie gelten bis zum Zeilenende. Leerzeilen werden ignoriert. Jede Zeile besteht aus sieben Spalten. In der ersten, auskommentierten, stehen die Spaltenköpfe:

#minute hour    mday    month   wday    who     command
|	|	|	|	|	|	|
|	|	|	|	|	|	+--Programm oder Script
|	|	|	|	|	+----------user, der Ausführung startet
|	|	|	|	+------------------Wochentag (0-7 oder Namen)
|	|	|	|			   0 & 7 stehen für Sonntag
|	|	|	+--------------------------Monat im Jahr (1-12)
|	|	+----------------------------------Tag des Monats (1-31 oder Namen)
|	+------------------------------------------Stunde (0-23)
+--------------------------------------------------Minute (0-59)

Achtung: Die Spalten dürfen nur durch Tab getrennt werden!

Die Spalten enthalten entweder einen Wert oder '*' (Asterisk/Sternchen). In einigen Dokumentationen steht, die crontab müsse mit einer Leerzeile oder einem Kommentar enden, dies scheint für die DS nicht zu stimmen.

Das Programm oder Script sollte mit dem kompletten Pfad angegeben werden, da cron nicht zwangsläufig die PATH-Variable des users benutzt.

Der Zeitpunkt, zu dem das Script oder Programm gestartet werden soll, wird durch die Uhrzeit, eingetragen in minute und hour und das Intervall, eingetragen in die Spalte für Tag oder Monat, definiert.

Folgende Möglichkeiten gibt es bei der Steuerung:

  1. Uhrzeit: in der Spalte hour eine '10' und in minute eine '30' startet das Script um 10:30.
  2. einzelne Zeitpunkte: In der Spalte hour '10,12,14' und in minute '00' startet das Script um 10:00, 12:00 und 14:00.
  3. Zeitspannen: In der Spalte hour '12-16' und in minute '15' startet das Script um 12:15, 13:15, 14:15, 15:15 und 16:15.
  4. Intervalle: In der Spalte hour '*/6' und minute '00' startet das Script alle 6 Stunden, also um 0:00, 6:00, 12:00 und 18:00.
  5. Kombinationen: in der Spalte hour '12-18/2' und minute '00' startet das Script alle zwei Stunden zwischen 12:00 und 18:00, also um 12:00, 14:00, 16:00 und 18:00.
  6. Namen: es können auch die ersten drei Buchstaben der engl. Namen der Wochentage und Monate benutzt werden, wobei die Groß-/Kleinschreibung keine Rolle spielt. Zeiträume sind allerdings nur mit Ziffern möglich.
  7. special time specifications: die ersten fünf Spalten können auch durch bestimmte Schlüsselwörter ersetzt werden:
    1. '@reboot', startet einmal nach dem startup
    2. '@yearly', startet einmal im Jahr, das entspricht '0 0 1 1 *'
    3. '@annually', startet einmal im Jahr, das entspricht '0 0 1 1 *'
    4. '@monthly', startet einmal im Monat, das entspricht '0 0 1 * *'
    5. '@weekly', startet einmal in der Woche, das entspricht '0 0 * * 0'
    6. '@daily', startet einmal am Tag, das entspricht '0 0 * * *'
    7. '@hourly, startet stündlich, das entspricht '0 * * * *'

Beispiel Backup-Steuerung

Es folgt ein Beispiel für die Steuerung eines Backups mit rsnapshot durch cron:

#minute hour    mday    month   wday    who     command
30      10-20   *       *       *       root    /opt/bin/rsnapshot hourly
30      23      *       *       *       root    /opt/bin/rsnapshot daily
30      22      *       *       5       root    /opt/bin/rsnapshot weekly
30      21      1       *       *       root    /opt/bin/rsnapshot monthly

Hier wird rsnapshot hourly jeden Tag um 10:30, 11:30 usw., zuletzt um 20:30 gestartet, rsnapshot daily wird jeden Tag um 23:30, rsnapshot weekly jede Woche am Freitag um 22:30 und rsnapshot monthly jeden ersten des Monats um 21:30 ausgeführt.

Starten von Kommandos als nicht-root User

In /etc/crontab ist zwar ein Feld, in dem man User eintragen kann unter deren Benutzer-ID das folgende Kommando gestartet werden sollte, jedoch wird dies ignoriert; alle Jobs werden unter der User-ID root (UID 0) gestartet.

Um das zu umgehen, gibt es zwei Möglichkeiten:

  • Man kann in der /etc/crontab das Kommando /bin/su -c <command> USER verwenden. Beispiel:
#minute hour    mday    month   wday    who     command
30      1       *       *       *       root    /bin/su -c "/some/where/script -parameter" user
  • Man kann im Verzeichnis /var/spool/cron/crontabs Dateien mit dem Namen des Nutzers anlegen, der den cronjob ausführen soll. Z.B. ist die dort vorhande Datei root ein symbolischer Link auf /etc/crontab.

Neustart des Cron-daemon

Änderungen in /etc/crontab werden unter Umständen erst gültig, wenn man crond neu gestartet hat:

/usr/syno/etc/rc.d/S04crond.sh stop
/usr/syno/etc/rc.d/S04crond.sh start

bzw. ab DSM 5.0

synoservicecfg --restart crond

Alternativ kann man crond das HUP-Signal schicken:

kill -HUP `pidof crond`

Anmerkung/Exkurs:
Normalerweise werden Änderungen an der /etc/crontab mittels crontab -e durchgeführt. Auf der Synology gibt es das Programm aber nicht und da das zugehörig Modul auch nicht in der busybox enthalten ist, führt das Erzeugen eines entsprechenden Links leider auch nicht zum Erfolg.

siehe auch