Cron: Unterschied zwischen den Versionen

Aus
Keine Bearbeitungszusammenfassung
 
(10 dazwischenliegende Versionen von 3 Benutzern werden nicht angezeigt)
Zeile 1: Zeile 1:
== Cron ==
[[Category:cron|!]]
 
Der Cron-Daemon ermöglicht es, Scripte und Programme zu genau definierten Zeitpunkten zu starten und ist auf der DS bereits vorinstalliert.
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 [http://www.synology-wiki.de/index.php/Backup_über_RSync_auf_einen_angeschlossenen_Datenträger rsync] oder [http://www.synology-wiki.de/index.php/Rsnapshot rsnapshot], deshalb am Ende ein entsprechendes Beispiel.
Eine weit verbreitete Anwendung ist das Backup mit [[Backup_über_RSync_auf_einen_angeschlossenen_Datenträger|rsync]] oder [[Rsnapshot]], deshalb am Ende ein entsprechendes Beispiel.


=== Cron konfigurieren ===
=== Cron konfigurieren ===
Zeile 9: Zeile 8:
Cron wird konfiguriert durch die Datei ''crontab'', die für jeden Benutzer einzeln angelegt werden kann. Dazu dient der Befehlt ''crontab -e''.
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 ''[http://www.synology-forum.de/showthread.html?t=2217 cronjobs]'' oder bearbeitet die Datei direkt mit einem Editor, z. B. dem bereits installierten [http://www.synology-wiki.de/index.php/Der_Editor_vi Vi].
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 ''[http://www.synology-forum.de/showthread.html?t=2217 cronjobs]'' oder bearbeitet die Datei direkt mit einem [[Vergleich von Texteditoren|Editor]], wie z.B. [[Vi]].


=== Aufbau von ''/etc/crontab'' ===
=== Aufbau von ''/etc/crontab'' ===
 
Cron-Tabellen bestehen aus beliebig vielen Zeilen. Kommentare werden durch # eingeleitet. Sie gelten bis zum Zeilenende. Leerzeilen werden ignoriert.
Die Datei besteht aus sieben Spalten. In der ersten, auskommentierten, stehen die Spaltenköpfe:
Jede Zeile besteht aus sieben Spalten. In der ersten, auskommentierten, stehen die Spaltenköpfe:
<pre>
<pre>
#minute hour    mday    month  wday    who    command
#minute hour    mday    month  wday    who    command
Zeile 28: Zeile 27:


'''Achtung: Die Spalten dürfen nur durch Tab getrennt werden!'''
'''Achtung: Die Spalten dürfen nur durch Tab getrennt werden!'''
Die Änderungen in ''/etc/crontab'' werden unter Umständen erst gültig, wenn man ''crond'' neu gestartet hat:
<pre>
/usr/syno/etc/rc.d/S04crond.sh stop
/usr/syno/etc/rc.d/S04crond.sh start
</pre>


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.
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.
Zeile 70: Zeile 63:


==== Starten von Kommandos als nicht-root User ====
==== 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, kann mun ''/bin/su -c <command> USER'' verwenden.
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.


Beispiel:
Um das zu umgehen, gibt es zwei Möglichkeiten:
* Man kann in der /etc/crontab das Kommando ''/bin/su -c <command> USER'' verwenden. Beispiel:
<pre>
<pre>
#minute hour    mday    month  wday    who    command
#minute hour    mday    month  wday    who    command
30      1      *      *      *      root    /bin/su -c "/some/where/script -parameter" user
30      1      *      *      *      root    /bin/su -c "/some/where/script -parameter" user
</pre>
</pre>
* 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:
<pre>
/usr/syno/etc/rc.d/S04crond.sh stop
/usr/syno/etc/rc.d/S04crond.sh start
</pre>
bzw. ab DSM 5.0
<pre>
synoservicecfg --restart crond
</pre>
Alternativ kann man crond das HUP-Signal schicken:
<pre>
kill -HUP `pidof crond`
</pre>
Anmerkung/Exkurs:<br>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 [http://linux.die.net/man/1/busybox busybox] enthalten ist, führt das Erzeugen eines entsprechenden Links leider auch nicht zum Erfolg.


=== siehe auch ===
=== siehe auch ===
*Wiki: [http://www.synology-wiki.de/index.php/Übersicht_über_verfügbare_3rd-Party-Apps_aus_unserer_Community Übersicht der 3rd-Party-Apps]
*Wiki: [[Übersicht_über_verfügbare_3rd-Party-Apps_aus_unserer_Community|Übersicht der 3rd-Party-Apps]]
*Wiki: [http://www.synology-wiki.de/index.php/Rsnapshot rsnapshot]
*Wiki: [[Rsnapshot]]
*Wiki: [http://www.synology-wiki.de/index.php/Backup_über_RSync_auf_einen_angeschlossenen_Datenträger Backup mit rsync]
*Wiki: [[Backup_über_RSync_auf_einen_angeschlossenen_Datenträger|Backup mit rsync]]
*Wiki: [http://www.synology-wiki.de/index.php/Generationsbackup_mit_rsync_und_rsnapshot_im_Netzwerk Generationsbackup mit rsync und rsnapshot im Netzwerk]
*Wiki: [[Generationsbackup mit rsync und rsnapshot im Netzwerk]]
* Wikipedia: [http://de.wikipedia.org/wiki/Cron Cron] (mit weiteren Syntax-Beispielen, z.B. für Jobs mit Periode von fünf Minuten)
* Linux man page: [http://linux.die.net/man/5/crontab crontab(5)]
* Linux man page: [http://linux.die.net/man/5/crontab crontab(5)]

Aktuelle Version vom 29. Juni 2015, 20:08 Uhr

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