Donnerstag, 2. Dezember 2010

esx cmd & other comands

zweigt die Plattengröße auf einem ESX Server an:
vdf -h


sql commands (oracle)
netstat -an | findstr 1524
sqlplus v500/v500@prod1

Mittwoch, 1. Dezember 2010

Cron einrichten (crontab)

Inhalt

Einleitung

Aus aktuellem Anlass habe ich mich dazu entschlossen nun ein Tutorial für die Einrichtung von Cron unter Linux (nicht ausschließlich Debian) zu schreiben. Cron ist dafür zuständig Programme oder Scripte zu einger gegebenen Uhrzeit bzw. zu einem gegebenen Datum auszuführen. Cron kann allerdings natürlich auch Programme und Scripte zu wiederkehrenden Uhrzeiten oder Wochentagen ausführen. Genaugenommen kann Cron so ziemlich alles Timen was man sich vorstellen kann. Aber dazu später mehr.

Zum einen möchte ich eine möglichst einfache und detailierte Beschreibung für Anfänger geben. Zum Anderen möchte ich aber auch in der Zusammenfassung nocheinmal alles beisammen haben für diejenigen die Cron an sich schon kennen, aber eine kurze und schnelle Hilfe gebrauchen können um sich die Möglichkeiten wieder ins Gedächtniss zu rufen.
Wenn jemandem noch etwas einfällt, was in diesem Tutorial fehlt, kann er mir das mit der Kommentarfunktion oder per eMail mitteilen. Über Kommentare freue ich mich natürlich in jedem Fall!

To top

Einfaches Timing unter Debian

Debian bietet einige Verzeichnisse die das schnelle Einrichten von häufig benötigten Cron-Aufträgen vereinfacht. Diese Verzeichnisse lauten:
/etc/cron.hourly/
/etc/cron.daily/
/etc/cron.weekly/
/etc/cron.monthly/

Die Namen verraten eigentlich schon welchem Zweck diese Verzeichnisse dienen. Alles was man tun muss, ist ein Script in einem dieser Verzeichnisse abzulegen (oder ein Symlink zu einem Script zu erzeugen) und Cron startet dieses Script dann, je nachdem in welches Verzeichniss man es legt, stündlich bis monatlich.
Hinweis: Immer darauf achten das die Scripte auch die erforderlichen Berechtigungen haben um ausgeführt zu werden.

Der Vollständigkeit halber möchte ich auch gleich noch das Verzeichniss /etc/cron.d/ erwähnen. Dieses Verzeichniss ist hilfreich, wenn man gut sortiert für jeden Anwendungszweck eine globale Konfigurationsdatei erstellen möchte. Hier findet also eine Einteilung nach Dateien statt. Die übliche konfiguration von Cron ist nach Benutzern unterteilt. Die Syntax dieser Datei entspricht jedoch der, die auch bei der benutzerbasierten Konfiguration verwendet wird.

To top

Der Befehl crontab

Der Befehl crontab wird dazu genutzt um Cron einzurichten. Die Syntax ist glücklicherweise recht einfach.
Mit crontab -e öffnet man die Crontab für den aktuellen Benutzer um sie zu editieren.
Um sich die Crontab nur auflisten zu lassen, führt man crontab -l aus.
Wer seine Crontab löschen möchte, kann dies mit crontab -r tun.
Eine weitere Sicherheitsabfrage vor dem Löschen erreicht man mit contab -ir.
Und wenn man auf die Crontab eines anderen Benutzers zugreifen möchte (sofern man die Berechtigungen dazu hat), kann man dies tun, indem man -u user dazwischen setzt. Also zum Beispiel: crontab -u user -e

Wenn man den Befehl zum Editieren einer Crontab eingegeben hat, öffnet sich die entsprechende Crontab direkt in einem Texteditor. Dort kann man sie beliebig editieren und speichern. Sobald man den Editor verlässt, wird die Crontab automatisch übernommen und ist ab sofort aktiv.

To top

Eine "einmalige" Aufgabe definieren

Es gibt natürlich noch andere simple Aufgaben, die nicht einfach über die Cron-Verzeichnisse definiert werden können. Dazu kommen wir gleich. Erstmal müssen wir dazu jedoch verstehen wie eine Crontab-Datei aufgebaut ist. Hierfür beschreibe ich erstmal wie man eine "einmalige" Aufgabe definiert. Allerdings ist sie nicht ganz einmalig. Sie wird jedes Jahr wiederholt, sofern man sie nicht löscht.
Jede Zeile definiert eine einzelne Aufgabe, auch Cronjob genannt. Es können beliebig viele Zeilen in einer Crontab-Datei stehen.
Die verschiedenen Parameter werden jeweils durch Leerzeichen getrennt. Die Zeilen sind folgermaßen aufgebaut:

Minute Stunde TagDesMonats Monat Wochentag Befehl

Normalerweise werden alle Parameter (bis auf den Befehl natürlich) in Zahlen angegeben. Der Monat und der Wochentag können allerdings auch in Namen eingegeben werden, was jedoch gewisse Einschränkungen mit sich bringt, wenn es um komplexere Aufgaben geht. Deshalb werde ich hier nicht weiter darauf eingehen.

Wenn man also um 10 Minuten nach 13 Uhr am 24 Dezember daran erinnert werden möchte das Heiligabend ist, müsste die Zeile in so lauten:

10 13 24 12 * echo "Es ist Heiligabend"

Was hat nun das Sternchen zu bedeuten? Ganz einfach: Es sagt aus das der Wochentag beliebig sein kann. Würde man statt dem * zum Beispiel eine 1 schreiben, würde der Befehl, entgegen dem was man vielleicht erwartet, AUCH jeden Montag ausgeführt werden! Und nicht nur wenn der 24. Dezember auf einen Montag fällt. Diese Besonderheit gilt es zu beachten!

To top

Wiederholende Aufgaben

Aber Cron kann wesentlich mehr als einen an Feiertage zu erinnern. Man könnte sich zum Beispiel daran erinnern lassen das Wochenende ist. Wer das braucht? Na jeder der gerade Urlaub hat und nicht vergessen will noch einzukaufen, bevor die Geschäfte dicht machen. Wie sähe solch eine Zeile aus? Zum Beispiel so:

0 13 * * 6 echo "Heute ist Samstag"

Dieser Eintrag meldet sich also an jedem Samstag um Punkt 13 Uhr. Warum gebe ich 0 und 13 ein anstatt einfach Sternchen zu benutzen? Ganz einfach: Würde ich Sternchen benutzen, würde der Befehl nicht nur einmal am Samstag ausgeführt werden, sondern jede Minute, solange Samstag ist. Wer es also aufdringlicher mag, kann den Befehl auch so gestalten:

0 * * * 6 echo "Heute ist Samstag"

Dieser Cronjob würde also an jedem Samstag ausgeführt werden, sobald die Uhrzeit 0 Minuten zeigt. Mit anderen Worten: Zu jeder vollen Stunde. Den ganzen Samstag lang. Etwas nervig, oder?

To top

Zeitabschnitte/Bereiche

Etwas zu jeder beliebigen Minute oder Stunde tun zu können ist an sich zwar ganz nett, aber noch lang nicht ausreichend. Wenn ich zum Beispiel nur einmal in der Stunde daran erinnert werden möchte das schon Samstag ist, aber nur in der Zeit zwischen 9 Uhr und 21 Uhr, dann sähe das so aus:

10 9-20 * * 6 echo "Es ist schon wieder Samstag"

Die 10 am Anfang sagt aus das der Alarm nicht zur vollen Stunde ausgelöst wird, sondern immer 10 Minuten danach. 9-20 sagt etwas über die Stunden aus. Das erste mal wird der Alarm also um 9:10 Uhr ausgelöst, dann um 10:10 Uhr usw. Bis 20:10 Uhr. Um 21:10 Uhr wird kein Alarm mehr geschlagen. Da ist der Tag dann ja auch nahezu vorbei.

Auf diese Weise können wir also Zeitabschnitte definieren in denen der Cronjob immer wieder ausgeführt wird. Das gleiche geht natürlich auch mit Monaten.
Jeder Mensch der viel mit Computern arbeitet kennt die Situation des blendenden Sonnenlichts im Sommer. Man kann dann kaum noch etwas auf dem Bildschirm erkennen. Damit man allerdings zumindest im Winter sei Rollo gelegentlich öffnet, wäre es vielleicht gut sich daran erinnern zu lassen das Momentan eher wenig Sonnenlicht ist. Damit wir hier nicht einen Schritt überspringen, wähle ich mal Oktober bis Dezember aus. Der Befehl würde so lauten:

0 9 * 10-12 * echo "Mach das Rollo hoch!"

Hiermit würden wir erreichen das jeden Tag um 9:00 Uhr eine Warnmeldung ausgegeben wird. Allerdings nur im 10. 11. und 12. Monat des Jahres.

To top

Listen

Und wenn ich nun mehrere unzusammenhängende Monate definieren möchte? Brauche ich dann mehrere Zeilen? Die Antwort lautet: Nein. Hierfür kann man Listen definieren. Möchte ich z.B. einen Befehl immer um 9:10 Uhr, um 10:10 Uhr, sowie um 13:10 Uhr und um 18:10 Uhr ausführen, dann sieht das wie folgt aus:

10 9,10,13,18 * * * echo "Was könnte das hier wohl bringen?"

Natürlich geht das auch mit den Minuten:

10,20,40 9,13 * * * echo "Noch kurioser!"

Wer jetzt aufgepasst hat, weiß bereits das dieser Cronjob jeweils um 9:10 Uhr, 9:20 Uhr, 9:40 Uhr, 13:10 Uhr, 13:20 Uhr und 13:40 Uhr ausgeführt wird. Mit Wochentagen geht das genauso. Denkbar wäre dies hier, zum Beispiel, für eine Erinnerung an die Termine für einen Verein.

30 16 * * 1,3,5 echo "Schützenverein - Schießen lernen - Freunde treffen"

Nun würde man jeden Montag, Mittwoch und Freitag um 16:30 Uhr an das Vereinstreffen erinnert werden.

To top

Schritte/Sprünge

Die letzte, aber nicht weniger wichtige, Funktion von Cron sind Schritte bzw. Sprünge in den definierten Bereichen. Wenn ich zum Beispiel jeden zweiten Monat daran erinnert werden möchte das ich viel zu faul bin, ginge das so:

10 16 15 1,3,5,7,9,11 * echo "Tu mal was!"

Das würde mich zwar am 15. Tag in jedem zweiten Monat um 16:10 Uhr daran erinnern das ich noch etwas tun müsste, wäre aber nicht sehr elegant. Wesentlich eleganter geht es hiermit:

10 16 15 1-12/2 * echo "Tu trotzdem mal etwas!"

Hiermit definiere ich den Zeitabschnitt vom 1. bis zum 12. Monat. Ich könnte stattdessen natürlich auch ein Sternchen benutzen. Der Schrägstrich sagt aus das aber nur jeder zweite Monat von dem Schritt erfasst wird. Cron fängt also am Anfang des Bereichs an. In unserem Fall ist das die Eins. Danach wird ein Schritt von zwei Monaten gegangen. Die Zwei wird also übersprungen, als nächstes kommt die Drei an die Reihe usw.

To top

Komplexere Aufgaben

Wenn man all diese Möglichkeiten kombiniert, kann man auch komplexe und teilweise absure Cronjobs erstellen. Cron könnte also auch einen Befehl an jedem Dienstag, Mittwoch und Donnerstag sowie an jedem 10. 12. 22. und 25. bis 30. im Monat auführen. Alle 10 Minuten um 9 bis 13 Uhr, sowie 18 Uhr und 22 Uhr. Aber nur innerhalb der ersten 40 Minuten in jeder Stunde. Und das ganze natürlich nur jeden dritten Monat im Jahr. Der Befehl dazu sieht so aus (ich hoffe ich mach jetzt keinen Fehler):

0-40/10 9-13,18,22 10,12,22,25-30 */3 2-4 echo "Was mache ich hier eigentlich?"

Dies ist nur ein wirres Beispiel um zu zeigen wie komplex ein Cronjob aussehen kann. Wer verstanden hat was hier abläuft und warum, der muss sich keine Sorgen bei der Einrichtung seiner Cronjobs machen. Aber in jedem Fall: Viel Spaß beim ausprobieren!

To top

Zusammenfassung

Dateiaufbau:

Minute Stunde TagDesMonats Monat Wochentag Befehl

Die Werte werden durch Leerzeichen getrennt. Der sechste Wert, also der Befehl, darf beliebig viele Leerzeichen enthalten, da er bis zum Ende der Zeile geht.

Erlaubte Werte:

Minute 0-59
Stunde 0-23
TagDesMonats 1-31
Monat 1-12
Wochentag 0-7 (0 oder 7 ist Sonntag)

Bereiche:

Bereiche werden mit einem Minus beschrieben. Von 1 Uhr bis 13 Uhr sieht also an der entsprechenden Stelle so aus: 1-13
Wenn man den gesamten Bereich definieren möchte, kann man dies auch mit einem Sternchen tun.

Listen:

Mehrere Werte können in einer Liste aneinandergereiht werden. Die Werte werden druch Kommas getrennt. Beispiel: 1,2,4,12

Schritte:

Schritte werden durch ein Schrägstrich definiert. Möchte man also nur jeden zweiten Wert aus einem Bereich haben, sieht das so aus: */2

Kombinationen:

Kombinationen sind erlaubt. Beispiel: 0-4,8-12

Namen statt Zahlen:

Es ist auch möglich Wochentage und Monate mit Namen statt mit Zahlen zu definieren. Dies ist jedoch nicht unbedingt zu empfehlen, da man bei Namen nicht mit Bereichen oder Listen gearbeitet werden kann. Namen sind jeweils die ersten 3 Buchstaben der englischen Bezeichnung. Also Jan, Feb, Mar, ... sowie Mon, Thu, Wed, usw.

Besonderheiten:

Bei einer Aufzählung in einer Liste und bei der definition von Bereichen muss unbedingt darauf geachtet werden keine Leerzeichen zu benutzen, da Cron sonst davon ausgehen würde, das es sich bereits um den Wert handelt.
Ausserdem muss beachtet werden das TagDesMonats und Wochentag unabhängig voneinander funktionieren. Legt man beispielsweise in einem Cronjob den ersten Tag des Monats fest und den Dienstag, wird der Cronjob sowohl am ersten Tag des Monats als auch an jedem Dienstag ausgeführt.

Add cron Job to VMware ESX/ESXi

This explains how to add a cron job to VMware in such a way that it will still be there after reboots.

Having
Logbook:Enable SSH access in VMware">enabled ssh access to your ESX/ESXi server, ssh in as root.

Firstly, add the cron job to the root crontab:
  1. Edit /var/spool/cron/crontabs/root
  2. Add the line (all on one line)
    5 0 * * * /full/path/to/script arguments/with/full/path > /full/path/to/logfile 2>&1
  3. Run the command "cat /var/run/crond.pid"
    That will print the process number of the running crond, such as 12345
  4. Run the command "kill 12345"
    where "12345" should be replaced with the number output by the previous command

For details of the meaning of "5 0 * * *" (5 minutes past midnight every day) read the man page for crontab(5) on any Unix/Linux server, or else
on the web.

Now, add a command to
/etc/rc.local to re-generate the cron job when ESX/ESXi reboots
  1. Edit /etc/rc.local, using a command such as "vi /etc/rc.local".
  2. At the end of the file, add 3 lines (using "G" then "O" in vi). The first kills crond, the second adds the new cron job to the root crontab file, ad the third restarts crond:
    /bin/kill $(cat /var/run/crond.pid)
    /bin/echo '5 0 * * * /full/path/to/script arguments/with/full/path > /full/path/to/logfile 2>&1' >> /var/spool/cron/crontabs/root
    /bin/busybox crond
  3. Save and exit the editor (Press the "Esc" key then ":wq" then press "Return" in vi)
  4. Run the command "auto-backup.sh" so that the change to /etc/rc.local survives a reboot.

Every time you change the cron job, remember to update
/etc/rc.local as well and run the "auto-backup.sh" command to backup the new /etc/rc.local file.