Mailinglist Archive: opensuse-de (4938 mails)

< Previous Next >
Re: Cronjobs
  • From: B.Brodesser@xxxxxxxxxxxxxx (Bernd Brodesser)
  • Date: Mon May 29 22:43:18 2000
  • Message-id: <20000530004318.B8225@xxxxxxxxxxxxxx>



* Stefan Malte Schumacher schrieb am 29.Mai.2000:

Ich habe folgendes Problem : Die Suse-Cronjobs starten leider manchmal
zu absolut unpassenden Zeitpunkten, z.B wenn ich CDs brenne. Einige CDs
sind dadurch schon mit Buffer-Underruns getötet werden, beim letzten
Mal war es mit 4 % doch irgendwie relativ knapp. Kann mir überhaupt mal
das Prinzip hinter dem Suse-Cronjob-Prinzip erklären ? Ich kann zwar
die Einträge in der crontab interpretieren, aber da scheinen ja nochmal
Sachen unter /usr/lib , /var/ und /etc/cron.daily von Bedeutung zu
sein.

Ich habe SuSE 6.3 und kann daher nur dieses beschreiben. Da sich hier
bei den letzten Ausgaben was getan hat, kann es sein, daß es bei 6.4
wieder etwas anders ist.

Ok, dann wollen wir mal: (ich fange lieber trotzdem von vorne an)

Erst einmal muß man unterscheiden zwichen /etc/crontab und Einträgen
in /var/cron/tabs/$USER unterscheiden. Da der Name des Users bei
/var/cron/tabs/$USER schon im Tabellenname steckt, braucht dort keine
Userangabe gemacht zu werden, und darf es daher auch nicht.

Ein Eintrag in /etc/crontab lautet:

Min Std Tag Monat Wtag User Befehl

typisches Beispiel:

5 22 * * * root test -x /usr/sbin/texpire && /usr/sbin/texpire

Es wird jeden Tag um 22.05 als root der Befehl
test -x /usr/sbin/texpire && /usr/sbin/texpire
ausgeführt. Bei den Minuten steht hier 5. Das heißt fünf Minuten nach
der vollen Stunde. Es könnte auch so etwas wie 10,30,50 stehen, das
würde sowohl zehn nach, als auch um halb als auch um zehn vor bedeuten.

Es wäre auch 10-20 möglich. Das hieße jede Minute zwichen zehn nach
und zwanzig nach. Auch eine Kombination ist möglich: 10-20,30-40,50
bedeutet jede Minute zwichen zehn und zwanzig nach sowie jede Minute
zwichen halb und zwanzig vor und um genau zehn vor.

Wichtig ist hier allerdings, daß kein Leerzeichen dazwichen gerät, da
dann die nächste Zahl als Stunde interpretiert würde.

* steht hier für jede Minute. Auch geht so etwas wie */2, was jede
zweite Minute bedeutet, oder */15 bedeutet alle Viertelstunden. Auch
geht soetwas wie 10-30/5 was alle fünf Minuten zwichen zehn nach und
halb bedeutet.

Entsprechendes gilt auch für Stunden, Tage, Monat und Wochentag. Bei
Wochentag ist noch zu sagen, daß 0 und 7 für Sonntag steht und
dementsprechend 1 für Montag usw.

Der Befehl wird ausgeführt, wenn sowohl Minute, Stunde, Tag *oder*
Wochentag und Monat stimmen. Bitte beachte das oder zwichen Tag und
Wochentag.

Der Eintrag

30 13 1,15 5-8 5 hugo echo Wir haben einen Monat ohne ``R''

wird jeden Freitag (5) *und* an jedem Ersten und 15. um 13.30 von Mai
bis August als User hugo ausgeführt.

Einträge in /var/cron/tabs/$USER funktionieren genau so, nur daß der
User im Eintrag nicht mehr auftauchen darf. Obiger Eintrag würde in
/var/cron/tabs/root

5 22 * * * test -x /usr/sbin/texpire && /usr/sbin/texpire

lauten. Der Eintrag mit den R-losen Monaten würde in
/var/cron/tabs/hugo stehen und

30 13 1,15 5-8 5 echo Wir haben einen Monat ohne ``R''

lauten.

Zu beachten ist, daß die Umgebungsvariablen wärend der Ausführung
anders sind als normalerweise. Insbesondere ist der Pfad anders
gesetzt. Man kann aber auch in der crontab Umgebungsvariablen explizit
angeben.

Wichtig ist auch zu wissen, daß dem Befehl keinem Bildschirm
zugeordnet ist. Wenn es eine Ausgabe oder Fehlerausgabe gibt, die
nicht umgelenkt wurde, so wird sie als mail verschickt.

Alles was im Befehl nach dem ersten unmaskierten % kommt wird als
Standardeingabe genommen. Weitere % stehen für ein Return. Will man
ein % haben, so muß man \% schreiben.

====================================================================

o, soweit zu dem wie crontab funktioniert. Mit cron kann man z.B
wunderschön Aufräumarbeiten machen. Das Problem sind Maschienen, die
nicht ständig laufen. Was nützt es, wenn in der crontab steht, daß
nachts um 3.00 alle älteren temporären Datein gelöscht werden sollen,
wenn um der Zeit der Rechner nicht läuft.

Bei UNIX stellt sich diese Problem nicht, der Rechner ist höchstens zu
den Betriebsferien ausgeschaltet, fals es soetwas gibt. Viele
Heimanwender schalten aus alter Gewohnheit aber ihren Rechner Nachts
aus.

Daher gibt es bei der SuSE-Standard crontab den Eintrag: [1]

-*/15 * * * * root test -x /usr/lib/cron/run-crons && /usr/lib/cron/run-crons

Das - am Anfang dient zur Vermeidung einer syslog-message. Jede
Viertelstunde wird somit als root /usr/lib/cron/run-crons ausgeführt,
so diese Datei existiert und ausführbar ist.

Was beinhaltet dieses Skript? Kann man ja nachsehen: ;))

Nach einigen Tests, ob es überhaupt ausgeführt werden soll [2] wird
nachgesehen, ob die Verzeichnisse /etc/cron.hourly, /etc/cron.daily,
/etc/cron.weekly und /etc/cron.monthly existiern. Wenn ja, so wird
nachgesehen, ob die Datei /var/cron/lastrun/cron.hourly,
/var/cron/lastrun/cron.daily, /var/cron/lastrun/cron.weekly bzw.
/var/cron/lastrun/cron.monthly älter als 60 min, ein Tag, sieben Tage
bzw. dreißig Tage ist und gegebenenfalls gelöscht. (Wenn sie älter
ist)

Ist eine solche Datei nicht vorhanden, sei es, daß sie noch nicht
eingerichtet war, sei es daß sie soeben gelöscht wurde, so wird nun
eine ebensolche angelegt und alle ausführbare Programme die sich im
Verzeichnis /etc/cron.hourly, /etc/cron.daily, /etc/cron.weekly bzw.
/etc/monthly befinden ausgeführt.

Ist hingegen die Datei /var/cron/lastrun/cron.hourly,
/var/cron/lastrun/cron.daily, /var/cron/lastrun/cron.weekly bzw.
/var/cron/lastrun/cron.monthly vorhanden und somit jünger als 60 min,
ein Tag, sieben Tage bzw. dreißig Tage (sonst wären sie nicht
vorhanden), so geschieht nichts.

Zum Schluß werden noch alle /var/cron/lastrun/* Dateien die jünger
sind als jetzt gelöscht. Dateien aus der Zukunft mögen wir nicht. ;)

Darüberhinaus gibt es in /etc/crontab noch folgende Einträge:

0 0 * * * root rm -f /var/cron/lastrun/cron.daily
0 0 * * 6 root rm -f /var/cron/lastrun/cron.weekly
0 0 1 * * root rm -f /var/cron/lastrun/cron.monthly

Diese Einträge bewirken, daß um Mitternacht jeden Tages
/var/cron/lastrun/cron.daily, um Mitternacht jeden Samstags
/var/cron/lastrun/cron.weekly und um Mitternacht jeden ersten eines
Monats /var/cron/lastrun/cron.monthly gelöscht wird. Das bewirkt, daß
eine viertel Stunde später die Programme in /etc/cron.daily,
/etc/cron.weekly bzw. /etc/cron.monthly ausgeführt werden.

Insgesamt bedeutet daß, das jeden Tag kurz nach Mitternacht alle
ausführbaren Dateien in /etc/cron.daily ausgeführt werden. Ist der
Rechner zu dieser Zeit nicht an, so passiert es ersatzweise kurz nach
dem booten. Entsprechendes gilt für die anderen Verzeichnisse.

[1] Es ist ein Eintrag wie jeder andere. Man kann ihm natürlich auch
heraus nehmen, aber dann sollte man wissen, was man tut.
Aufräumarbeiten sind nicht schlecht.

[2] Für Dich sehr interessant sind folgende Zeilen aus
/usr/lib/cron/run-crons:

CDR_PROG="/usr/bin/cdrecord /usr/bin/cdwrite"
if test -n "$CDR_PROG" -a -x /bin/fuser ; then
/bin/fuser -s $CDR_PROG 2>/dev/null && exit 0
fi

Das heißt, falls Du /bin/fuser aus dem Paket ps installiert hast, was
eigentlich der Fall sein dürfte, so wird /usr/lib/cron/run-crons
nicht ausgeführt, besser gesagt, die Ausführung hört hier auf, wenn
irgendwo /usr/bin/cdrecord oder /usr/bin/cdwrite läuft.

Das müßte eigendlich Dein Problem beheben. Hast Du ein anderes
Schreibprogramm, so kannst Du diese mit vollen Pfad ja noch in
CDR_PROG mit aufnehmen.

Trotzdem ausgeführt werden alle Programme, die direkt in der crontab
stehen.

Und ich wiederhole es noch mal, es kann sein, daß es bei der 6.4 etwas
anders aussieht.

Wie kann ich es vermeiden, daß die Skripte ausgeführt werden wenn
cdrecord oder cdrdao aktiv bzw. das cdrdao und cdrecord während des
Ausführung einen Brennvorgang starten ?

/usr/lib/cron/run-crons und damit die Programme in /etc/cron.daily
sollten nicht ausgeführt werden, wenn irgendwo /usr/bin/cdrecord
läuft. Sollte das bei cdrdao auch sein, so ergänze in
/usr/lib/cron/run-crons die Zeile
CDR_PROG="/usr/bin/cdrecord /usr/bin/cdwrite"
zu
CDR_PROG="/usr/bin/cdrecord /usr/bin/cdwrite /usr/bin/cdrdao"

ich nehme mal an, daß cdrdao auch unter /usr/bin steht, sonst schreibe
hier den richtigen Pfad hin. Überprüfe auch, ob /usr/bin/cdrecord der
richtige Pfad ist.

Unabhängig davon dürfte aber /etc/cron.daily/* nur kurz nach dem
booten, bzw. nach Mitternacht ausgeführt werden.

Bernd


--
Umsteiger von Microsoft Windows xx?
Hast Du schon file://usr/doc/howto/de/DE-DOS-nach-Linux-HOWTO.txt gelesen?
Auch file://usr/doc/Books/Linuxhandbuch.dvi ist zu empfehlen.
|Zufallssignatur 1

---------------------------------------------------------------------
To unsubscribe, e-mail: suse-linux-unsubscribe@xxxxxxxx
For additional commands, e-mail: suse-linux-help@xxxxxxxx


< Previous Next >
Follow Ups