dingoss wrote:* * * * root sh user.sh
1. Wo kann man crontabs ablegen?
Cron liest /etc/crontab und alle Dateien in /etc/cron.d. Diese Dateien haben das "Format mit Userfeld".
Cron sucht außerdem in /var/spool/cron/tabs nach Dateien, die mit "crontab -e" von einem User angelegt worden sind und die so heißen, wie der User, der sie angelegt hat. Diese Dateien haben das "Format ohne Userfeld".
/etc/crontab gehört zum System und sollte niemals vom Admin geändert werden. /etc/cron.d/-Dateien werden von rpm-Packages installiert, heißen meist so wie das Package und sollten ebenfalls nicht vom Admin installiert oder geändert werden.
2. Wie sieht eine Crontab aus.
Alle Crontabs haben fünf Felder für Zeitangaben. Bei Crontabs mit Userfeld kommt dann ein Username als sechstes Feld. Alle folgenden Felder sind das Kommando und seine Parameter. Bei Crontabs ohne Userfeld entfällt das Userfeld, sodaß das Kommando Feld 6 und die folgenden belegt.
Die fünf ersten Felder geben die Zeit an, zu der ein Kommando ausgeführt wird. Die Felder sind von links nach rechts Minuten, Stunden, Tage, Monate und Wochentagsnummer. Wenn ein Feld "*" heißt, bedeutet dies "jeden".
* * * * * /usr/bin/touch /tmp/blafasel
wird also jede Minute, jede Stunde, jeden Tag, jeden Monat an jedem Wochentag das Kommando "/usr/bin/touch /tmp/blafasel" ausführen.
Die Felder werden miteinander ver-und-et.
50 12 * * 0 /usr/bin/touch /tmp/blafasel
wird also jeden Sonntag um 12:50 ausgeführt, also wenn es Wochentag 0 und Stunde 12 und Minute 50 ist.
Man kann Listen angeben:
0,10,20,30,40,50 * * * 0 /usr/bin/touch /tmp/blafasel
wird ausgeführt, wenn es Wochentag Nummer 0 UND (0 oder 10 oder 20 oder 30 oder 40 oder 50) Minuten ist. Also den ganzen Sonntag alle 10 Minuten genau auf dem 10-Minuten-Intervall.
3. Wie sieht das Environment von Cronjobs aus?
Dazu schreibt man sich /usr/local/bin/showme.sh:
Code: Select all
#! /bin/bash --
(
echo "user id:"
/usr/bin/id
echo
echo "current directory:"
pwd
echo
echo "Environment:"
/usr/bin/printenv | /usr/bin/sort
echo
) > /tmp/showme.out
und führt dies aus (Warnung: Dies zerstört eine eventuell vorhandene Root-Crontab!):
Code: Select all
# cd
# echo "* * * * * /usr/local/bin/showme.sh" > crontab.root
# crontab crontab.root
# crontab -l
# DO NOT EDIT THIS FILE - edit the master and reinstall.
# (x installed on Mon Jan 30 21:37:00 2006)
# (Cron version V5.0 -- $Id: crontab.c,v 1.12 2004/01/23 18:56:42 vixie Exp $)
* * * * * /usr/local/bin/showme.sh
Nach einer Minute findet man in /tmp/showme.out eine Datei, die User-ID, aktuelles Verzeichnis und Environment von Cronjobs findet. Hier ist vor allen Dingen der Inhalt von PATH und HOME interessant.
Mit
kann man die Crontab wieder löschen.
4. Wie schreibe ich cronjobs die funktionieren?
Beachte den Output von showme.out: Cronjobs haben unter Umständen nicht das richtige aktuelle Verzeichnis und verwenden unter Umständen nicht denselben $PATH wie Du.
Fange einen Cronjob also mit Anweisungen an, die den PATH und das aktuelle Verzeichnis korrekt definieren. Sorge auch sonst dafür, daß das Environment korrekt konfiguriert ist ("export WASAUCHIMMER=wasauchimmer").
Code: Select all
#! /usr/bin/bash --
PATH=....
cd /...
Setze also den PATH so, wie er auch bei Dir in Deiner Shell gesetzt ist und wechsle als erstes im Cronjob manuell in das Home-Verzeichnis.
Schreibe außerdem in Deinem Cronjob ein Log. Prüfe dazu den Exitstatus kritischer Befehle.
Sende bei Fehlern eine Mail an den Eigentümer des Cronjobs (manche Crons senden einem automatisch den Stdout und das Stderr von Cronjobs zu, sodaß man hier nur ein "echo" einbauen muß, um Fehler zu melden.)
Verwende im Zweifel vollständige Pfadnamen für Kommandos und Logdateien.