Cron: Unterschied zwischen den Versionen
K (→Beispiel) |
KKeine Bearbeitungszusammenfassung |
||
Zeile 1: | Zeile 1: | ||
Alle WEB-Pakete bei Hostsharing erlauben die Ausführung von Skripten auf dem Server. (außer SW-Pakete) Dabei gibt es mehrere Möglichkeiten, zum einen direkt in den Webserver eingebundene Module, zum anderen die Ausführung über CGI (Common Gateway Interface). Letzteres ist keine eigene Skriptsprache, sondern nur eine Schnittstelle, über die Daten an eine Skriptsprache, wie z.B. perl oder [[PHP|php]] übergeben werden können. Solche Daten könnten z.B. die abgerufene URL, Zugriff auf Cookies etc. sein. Über die Schnittstelle CGI können Skriptsprachen wie [[Perl]], [[Python]] oder [[PHP]], sowie selbst kompilierte Binär-Programme ausgeführt werden. | |||
CGI-Skripte liegen bei Hostsharing in einem Verzeichnisbaum direkt unter der Domain in einem Verzeichnis mit dem Namen cgi, also parallel zu den Verzeichnissen etc, subs und var. Von Seiten der URL werden sie als /cgi-bin eingeblendet. Ein Script, das unter ~/doms/example.com/cgi/ liegt, wird also über http://www.example.com/cgi-bin/ angesprochen. | |||
Ein kleines Beispiel soll uns zeigen, was CGI eigentlich leistet. Dazu erstellen wir die Datei test.cgi in unserem CGI-Verzeichnis mit folgendem Inhalt: | |||
<syntaxhighlight lang=shell line> | |||
#!/bin/sh | |||
echo Content-type: text/plain | |||
echo | |||
set | |||
</syntaxhighlight> | |||
Nach dem Abspeichern müssen wir die Datei noch als ausführbar markieren (dies muss beides mit dem Domain-Admin-Account gemacht werden, da nur der an das CGI-Verzeichnis herankommt): | |||
<syntaxhighlight lang=shell> | |||
xyz00-hans@h01$ chmod +x ~/doms/example.com/cgi/test.cgi | |||
</syntaxhighlight> | |||
Dieses kleine Skript macht nichts weiter, als in einem HTTP-Header dem Browser mitzuteilen, dass es sich um einfachen Text handelt und ihn dann zu veranlassen, die gesamten Parameter auszugeben, die über die CGI-Schnittstelle als Umgebungsvariable mitgegeben wurden. | |||
Ein Aufruf der URL http://www.example.com/cgi-bin/test.cgi erzeugt also in etwa folgende Ausgabe: | |||
<syntaxhighlight lang=shell line> | |||
BASH=/bin/sh | |||
BASH_ARGC=() | |||
BASH_ARGV=() | |||
BASH_LINENO=([0]="0") | |||
BASH_SOURCE=([0]="test.cgi") | |||
BASH_VERSINFO=([0]="3" [1]="1" [2]="17" [3]="1" [4]="release" [5]="i486-pc-linux-gnu") | |||
BASH_VERSION='3.1.17(1)-release' | |||
DIRSTACK=() | |||
DOCUMENT_ROOT=/home/doms/example.com/htdocs | |||
EUID=20085 | |||
GATEWAY_INTERFACE=CGI/1.1 | |||
GROUPS=() | |||
HOSTNAME=h01.hostsharing.net | |||
HOSTTYPE=i486 | |||
HTTP_ACCEPT='text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8' | |||
HTTP_ACCEPT_CHARSET='ISO-8859-1,utf-8;q=0.7,*;q=0.7' | |||
HTTP_ACCEPT_ENCODING=gzip,deflate | |||
HTTP_ACCEPT_LANGUAGE='de-de,de;q=0.8,it;q=0.7,it-ch;q=0.5,en-us;q=0.3,en;q=0.2' | |||
HTTP_CONNECTION=keep-alive | |||
HTTP_HOST=www.example.com | |||
HTTP_KEEP_ALIVE=300 | |||
HTTP_USER_AGENT='Mozilla/5.0 (Windows; U; Windows NT 5.1; de; rv:1.9.0.10) Gecko/2009042316 Firefox/3.0.10' | |||
IFS=' | |||
' | |||
MACHTYPE=i486-pc-linux-gnu | |||
OPTERR=1 | |||
OPTIND=1 | |||
OSTYPE=linux-gnu | |||
PATH=/usr/local/bin:/usr/bin:/bin | |||
PIPESTATUS=([0]="0") | |||
POSIXLY_CORRECT=y | |||
PPID=28217 | |||
PS4='+ ' | |||
PWD=/home/pacs/xyz00/doms/example.com/cgi | |||
QUERY_STRING= | |||
REMOTE_ADDR=84.139.46.155 | |||
REMOTE_PORT=62438 | |||
REQUEST_METHOD=GET | |||
REQUEST_URI=/cgi-bin/test.cgi | |||
SCRIPT_FILENAME=/home/doms/example.com/cgi/test.cgi | |||
SCRIPT_NAME=/cgi-bin/test.cgi | |||
SCRIPT_URI=http://www.example.com/cgi-bin/test.cgi | |||
SCRIPT_URL=/cgi-bin/test.cgi | |||
SERVER_ADDR=83.223.95.29 | |||
SERVER_ADMIN=xyz00@h01.hostsharing.net | |||
SERVER_NAME=www.example.com | |||
SERVER_PORT=80 | |||
SERVER_PROTOCOL=HTTP/1.1 | |||
SERVER_SIGNATURE='<address>Apache/2.2.3 (Debian) mod_jk/1.2.18 mod_ssl/2.2.3 OpenSSL/0.9.8c Server at www.example.com Port 80</address> | |||
' | |||
SERVER_SOFTWARE='Apache/2.2.3 (Debian) mod_jk/1.2.18 mod_ssl/2.2.3 OpenSSL/0.9.8c' | |||
SHELL=/bin/bash | |||
SHELLOPTS=braceexpand:hashall:interactive-comments:posix | |||
SHLVL=1 | |||
TERM=dumb | |||
UID=20085 | |||
_=echo | |||
</syntaxhighlight> | |||
{{Textkasten|gelb|Achtung|Eine typische Falle ist das Hochladen von Dateien mit MS-DOS Zeilenumbrüchen (CR/LF) statt UNIX Zeilenumbrüchen (LF). Da die erste Zeile in einem solchen Skript (hier #!/bin/sh) das Programm angibt, mit dem das Skript ausgeführt wird, wird schon das fehlschlagen, da sich am Ende der Zeile ein unsichtbares CR befinden wird. Der HTTP Fehler 500 (Internal Server Error) wird erscheinen. FTP bietet zu dem Zweck den ASCII-Mode an, der die Transformation zwischen den Systemen vornimmt. Binäre Dateien (z.B. Grafiken) sollten niemals, Skripte dagegen immer im ASCII-Modus übertragen werden.}} | |||
---- | |||
[[Kategorie:HSDoku]] | |||
[[Kategorie:WWW]] | |||
[[Kategorie:Glossar]] | |||
{{HSDoku-Links}} | {{HSDoku-Links}} | ||
Cron ist ein UNIX-Dienst, mit dem regelmäßige Jobs ausgeführt werden können, ohne dass der Benutzer dabei am System angemeldet sein muss. Dazu wird mit dem Kommando crontab die Konfiguration erstellt, aus der das System entnehmen kann, welches Kommando zu welcher Zeit auszuführen ist. Den Rest erledigt dann ein Systemprozess, der jede Minute überprüft, ob für einen User ein Job auszuführen ist. | Cron ist ein UNIX-Dienst, mit dem regelmäßige Jobs ausgeführt werden können, ohne dass der Benutzer dabei am System angemeldet sein muss. Dazu wird mit dem Kommando crontab die Konfiguration erstellt, aus der das System entnehmen kann, welches Kommando zu welcher Zeit auszuführen ist. Den Rest erledigt dann ein Systemprozess, der jede Minute überprüft, ob für einen User ein Job auszuführen ist. | ||
Zeile 5: | Zeile 93: | ||
Anzeigen der aktuellen Konfiguration: | Anzeigen der aktuellen Konfiguration: | ||
< | <syntaxhighlight lang=shell> | ||
crontab -l | crontab -l | ||
</ | </syntaxhighlight> | ||
Löschen der kompletten Konfiguration: | Löschen der kompletten Konfiguration: | ||
< | <syntaxhighlight lang=shell> | ||
crontab -r | crontab -r | ||
</ | </syntaxhighlight> | ||
Ändern der Konfiguration: | Ändern der Konfiguration: | ||
< | <syntaxhighlight lang=shell> | ||
crontab -e | crontab -e | ||
</ | </syntaxhighlight> | ||
Crontab von einer Datei starten: | Crontab von einer Datei starten: | ||
< | <syntaxhighlight lang=shell> | ||
crontab myjob | crontab myjob | ||
</ | </syntaxhighlight> | ||
Der beim Editieren verwendete Editor wird durch die Umgebungsvariablen EDITOR und VISUAL bestimmt. Der Default ist vi. Alternativ kann man folgenden Weg gehen: | Der beim Editieren verwendete Editor wird durch die Umgebungsvariablen EDITOR und VISUAL bestimmt. Der Default ist vi. Alternativ kann man folgenden Weg gehen: | ||
< | <syntaxhighlight lang=shell> | ||
xyz00@hopi:~$crontab -l > myjobs | xyz00@hopi:~$crontab -l > myjobs | ||
</ | </syntaxhighlight> | ||
Dann die Datei myjobs mit einem beliebigen Editor anpassen. Anschließend den cronjob von der Datei myjobs starten und die Datei löschen: | Dann die Datei myjobs mit einem beliebigen Editor anpassen. Anschließend den cronjob von der Datei myjobs starten und die Datei löschen: | ||
< | <syntaxhighlight lang=shell> | ||
xyz00@hopi:~$ crontab myjobs | xyz00@hopi:~$ crontab myjobs | ||
xyz00@hopi:~$ rm myjobs | xyz00@hopi:~$ rm myjobs | ||
</ | </syntaxhighlight> | ||
=== Dateiformat === | === Dateiformat === | ||
Kommentare werden mit # am Zeilenanfang gekennzeichnet. Eine Befehlszeile in der Crontab-Datei besteht aus sechs durch Leerzeichen getrennten Feldern, wobei die ersten fünf Felder den Zeitpunkt der Ausführung festlegen und der Rest der Zeile das auszuführende Kommando bestimmt. Die ersten fünf Felder sind: | Kommentare werden mit # am Zeilenanfang gekennzeichnet. Eine Befehlszeile in der Crontab-Datei besteht aus sechs durch Leerzeichen getrennten Feldern, wobei die ersten fünf Felder den Zeitpunkt der Ausführung festlegen und der Rest der Zeile das auszuführende Kommando bestimmt. Die ersten fünf Felder sind: | ||
< | <syntaxhighlight> | ||
* Minute (0-59) | * Minute (0-59) | ||
* Stunde (0-23) | * Stunde (0-23) | ||
Zeile 38: | Zeile 126: | ||
* Monat (1-12 oder JAN-DEC) | * Monat (1-12 oder JAN-DEC) | ||
* Wochentag (0-7; 0 und 7 entsprechen jeweils Sonntag oder SUN-SAT) | * Wochentag (0-7; 0 und 7 entsprechen jeweils Sonntag oder SUN-SAT) | ||
</ | </syntaxhighlight> | ||
Ein Stern * steht dabei für alle möglichen Werte eines Feldes. Die Felder können auch als Bereich (z.B. 2-4) und Liste (z.B. 3,6,8) angegeben werden. Auch lassen sich Schrittweiten für ein Feld angeben(z.B. */2). Dies kann auch kombiniert werden (z.B. 4-54/10). | Ein Stern * steht dabei für alle möglichen Werte eines Feldes. Die Felder können auch als Bereich (z.B. 2-4) und Liste (z.B. 3,6,8) angegeben werden. Auch lassen sich Schrittweiten für ein Feld angeben(z.B. */2). Dies kann auch kombiniert werden (z.B. 4-54/10). | ||
Zeile 48: | Zeile 136: | ||
Folgende Umgebungsvariablen können in der crontab-Datei gesetzt werden: | Folgende Umgebungsvariablen können in der crontab-Datei gesetzt werden: | ||
< | <syntaxhighlight lang="ini"> | ||
PWD | PWD | ||
Zeile 62: | Zeile 150: | ||
MAILTO | MAILTO | ||
</ | </syntaxhighlight> | ||
=== Beispiel === | === Beispiel === | ||
<syntaxhighlight lang=shell line> | <syntaxhighlight lang=shell line> |
Version vom 24. Juni 2024, 10:21 Uhr
Alle WEB-Pakete bei Hostsharing erlauben die Ausführung von Skripten auf dem Server. (außer SW-Pakete) Dabei gibt es mehrere Möglichkeiten, zum einen direkt in den Webserver eingebundene Module, zum anderen die Ausführung über CGI (Common Gateway Interface). Letzteres ist keine eigene Skriptsprache, sondern nur eine Schnittstelle, über die Daten an eine Skriptsprache, wie z.B. perl oder php übergeben werden können. Solche Daten könnten z.B. die abgerufene URL, Zugriff auf Cookies etc. sein. Über die Schnittstelle CGI können Skriptsprachen wie Perl, Python oder PHP, sowie selbst kompilierte Binär-Programme ausgeführt werden.
CGI-Skripte liegen bei Hostsharing in einem Verzeichnisbaum direkt unter der Domain in einem Verzeichnis mit dem Namen cgi, also parallel zu den Verzeichnissen etc, subs und var. Von Seiten der URL werden sie als /cgi-bin eingeblendet. Ein Script, das unter ~/doms/example.com/cgi/ liegt, wird also über http://www.example.com/cgi-bin/ angesprochen.
Ein kleines Beispiel soll uns zeigen, was CGI eigentlich leistet. Dazu erstellen wir die Datei test.cgi in unserem CGI-Verzeichnis mit folgendem Inhalt:
#!/bin/sh
echo Content-type: text/plain
echo
set
Nach dem Abspeichern müssen wir die Datei noch als ausführbar markieren (dies muss beides mit dem Domain-Admin-Account gemacht werden, da nur der an das CGI-Verzeichnis herankommt):
xyz00-hans@h01$ chmod +x ~/doms/example.com/cgi/test.cgi
Dieses kleine Skript macht nichts weiter, als in einem HTTP-Header dem Browser mitzuteilen, dass es sich um einfachen Text handelt und ihn dann zu veranlassen, die gesamten Parameter auszugeben, die über die CGI-Schnittstelle als Umgebungsvariable mitgegeben wurden.
Ein Aufruf der URL http://www.example.com/cgi-bin/test.cgi erzeugt also in etwa folgende Ausgabe:
BASH=/bin/sh
BASH_ARGC=()
BASH_ARGV=()
BASH_LINENO=([0]="0")
BASH_SOURCE=([0]="test.cgi")
BASH_VERSINFO=([0]="3" [1]="1" [2]="17" [3]="1" [4]="release" [5]="i486-pc-linux-gnu")
BASH_VERSION='3.1.17(1)-release'
DIRSTACK=()
DOCUMENT_ROOT=/home/doms/example.com/htdocs
EUID=20085
GATEWAY_INTERFACE=CGI/1.1
GROUPS=()
HOSTNAME=h01.hostsharing.net
HOSTTYPE=i486
HTTP_ACCEPT='text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8'
HTTP_ACCEPT_CHARSET='ISO-8859-1,utf-8;q=0.7,*;q=0.7'
HTTP_ACCEPT_ENCODING=gzip,deflate
HTTP_ACCEPT_LANGUAGE='de-de,de;q=0.8,it;q=0.7,it-ch;q=0.5,en-us;q=0.3,en;q=0.2'
HTTP_CONNECTION=keep-alive
HTTP_HOST=www.example.com
HTTP_KEEP_ALIVE=300
HTTP_USER_AGENT='Mozilla/5.0 (Windows; U; Windows NT 5.1; de; rv:1.9.0.10) Gecko/2009042316 Firefox/3.0.10'
IFS='
'
MACHTYPE=i486-pc-linux-gnu
OPTERR=1
OPTIND=1
OSTYPE=linux-gnu
PATH=/usr/local/bin:/usr/bin:/bin
PIPESTATUS=([0]="0")
POSIXLY_CORRECT=y
PPID=28217
PS4='+ '
PWD=/home/pacs/xyz00/doms/example.com/cgi
QUERY_STRING=
REMOTE_ADDR=84.139.46.155
REMOTE_PORT=62438
REQUEST_METHOD=GET
REQUEST_URI=/cgi-bin/test.cgi
SCRIPT_FILENAME=/home/doms/example.com/cgi/test.cgi
SCRIPT_NAME=/cgi-bin/test.cgi
SCRIPT_URI=http://www.example.com/cgi-bin/test.cgi
SCRIPT_URL=/cgi-bin/test.cgi
SERVER_ADDR=83.223.95.29
SERVER_ADMIN=xyz00@h01.hostsharing.net
SERVER_NAME=www.example.com
SERVER_PORT=80
SERVER_PROTOCOL=HTTP/1.1
SERVER_SIGNATURE='<address>Apache/2.2.3 (Debian) mod_jk/1.2.18 mod_ssl/2.2.3 OpenSSL/0.9.8c Server at www.example.com Port 80</address>
'
SERVER_SOFTWARE='Apache/2.2.3 (Debian) mod_jk/1.2.18 mod_ssl/2.2.3 OpenSSL/0.9.8c'
SHELL=/bin/bash
SHELLOPTS=braceexpand:hashall:interactive-comments:posix
SHLVL=1
TERM=dumb
UID=20085
_=echo
Achtung
Eine typische Falle ist das Hochladen von Dateien mit MS-DOS Zeilenumbrüchen (CR/LF) statt UNIX Zeilenumbrüchen (LF). Da die erste Zeile in einem solchen Skript (hier #!/bin/sh) das Programm angibt, mit dem das Skript ausgeführt wird, wird schon das fehlschlagen, da sich am Ende der Zeile ein unsichtbares CR befinden wird. Der HTTP Fehler 500 (Internal Server Error) wird erscheinen. FTP bietet zu dem Zweck den ASCII-Mode an, der die Transformation zwischen den Systemen vornimmt. Binäre Dateien (z.B. Grafiken) sollten niemals, Skripte dagegen immer im ASCII-Modus übertragen werden.
Einstieg |
Hsadmin |
Pakete |
User |
Domains |
Systemd |
Logging |
E-Mail |
WWW
Datenbanken |
Backup & Restore |
Installationsanleitungen |
FAQ |
Bugtracker
Cron ist ein UNIX-Dienst, mit dem regelmäßige Jobs ausgeführt werden können, ohne dass der Benutzer dabei am System angemeldet sein muss. Dazu wird mit dem Kommando crontab die Konfiguration erstellt, aus der das System entnehmen kann, welches Kommando zu welcher Zeit auszuführen ist. Den Rest erledigt dann ein Systemprozess, der jede Minute überprüft, ob für einen User ein Job auszuführen ist.
Crontab
Mit crontab wird sowohl das Kommando zum Erstellen, Ändern und Löschen der eigenen Konfiguration als auch das dabei benutzte Dateiformat bezeichnet. Deshalb bekommt man die Beschreibung des Kommandos mit man 1 crontab und die Beschreibung des Formates mit man 5 crontab angezeigt.
Anzeigen der aktuellen Konfiguration:
crontab -l
Löschen der kompletten Konfiguration:
crontab -r
Ändern der Konfiguration:
crontab -e
Crontab von einer Datei starten:
crontab myjob
Der beim Editieren verwendete Editor wird durch die Umgebungsvariablen EDITOR und VISUAL bestimmt. Der Default ist vi. Alternativ kann man folgenden Weg gehen:
xyz00@hopi:~$crontab -l > myjobs
Dann die Datei myjobs mit einem beliebigen Editor anpassen. Anschließend den cronjob von der Datei myjobs starten und die Datei löschen:
xyz00@hopi:~$ crontab myjobs
xyz00@hopi:~$ rm myjobs
Dateiformat
Kommentare werden mit # am Zeilenanfang gekennzeichnet. Eine Befehlszeile in der Crontab-Datei besteht aus sechs durch Leerzeichen getrennten Feldern, wobei die ersten fünf Felder den Zeitpunkt der Ausführung festlegen und der Rest der Zeile das auszuführende Kommando bestimmt. Die ersten fünf Felder sind:
* Minute (0-59)
* Stunde (0-23)
* Tag des Monats (1-31)
* Monat (1-12 oder JAN-DEC)
* Wochentag (0-7; 0 und 7 entsprechen jeweils Sonntag oder SUN-SAT)
Ein Stern * steht dabei für alle möglichen Werte eines Feldes. Die Felder können auch als Bereich (z.B. 2-4) und Liste (z.B. 3,6,8) angegeben werden. Auch lassen sich Schrittweiten für ein Feld angeben(z.B. */2). Dies kann auch kombiniert werden (z.B. 4-54/10).
Das dritte und fünfte Feld können beide den Tag der Ausführung bezeichnen. Sind beide gesetzt, also nicht *, so wird der Job ausgeführt, wenn einer der beiden Bedingungen erfüllt ist.
Statt einer Zeitangabe kann auch @reboot
verwendet werden. In diesem Fall wird z.B. ein Dienst nach dem Neustart des Servers wieder gestartet.
Umgebungsvariablen
Folgende Umgebungsvariablen können in der crontab-Datei gesetzt werden:
PWD
LOGNAME
SHLVL
SHELL
HOME
PATH
MAILTO
Beispiel
# Alle Meldungen per Mail an diesen User schicken
MAILTO=xyz00
# bei einem Neustart des Servers soll der Monit Dienst gestartet werden
@reboot rm -f $HOME/var/run/* && /usr/bin/monit -c "$HOME/.monitrc"
# Fuenf Minuten nach Mitternacht
5 0 * * * $HOME/bin/daily.job >> $HOME/tmp/out 2>&1
# Um 14:15 an jedem Monatsersten
15 14 1 * * $HOME/bin/monthly
# 0:23, 2:23, 4:23, 6:23 ... 22:23
23 0-23/2 * * * echo "run 23 minutes after midn, 2am, 4am ..., everyday"
# Jeden Sonntag um 4:05
5 4 * * sun echo "run at 5 after 4 every sunday"
# Jeden Freitag und jeden 1. des Monats um 4:05
5 4 1 * 5 echo "run at 5 after 4 every friday and every 1st"
Eine vollständige Beschreibung ist in der Manpage vorhanden: man 5 crontab.
Performancehinweise
Da Cronjobs einen erheblichen Teil der Systemlast ausmachen, sollen die folgenden Grundregeln beachtet werden:
- Jobs wenn möglich über Nacht laufen lassen.
- Priorität des Jobs mit nice reduzieren.
- Glatte Minutenwerte (0,5,10,15,20,...) vermeiden. Statt */10 kann man auch 7-57/10 verwenden.
Fehlerquellen
Manchmal funktioniert ein Script interaktiv in der Shell ohne Probleme, wird aber beim Eintrag in die Crontab anscheinend nicht ausgeführt. Eine Ursache kann die fehlerhafte Spezifikation der Ausführungszeit in der Crontab sein. Außerdem haben die Login-Shell und cron unterschiedliche Umgebungsvariablen. Neben dem aktuellen Arbeitsverzeichnis kann PATH unterschiedlich für cron und die Login-Shell sein.
Login-Shell: /usr/local/bin/su wird zuerst gefunden.
cron: /bin/su wird zuerst gefunden.
Wenn Cronjobs nicht ausgeführt werden, dann befinden sich die aufgerufenen Programme häufig auch in anderen Verzeichnissen.