Linux automatisieren
Administrationsaufgaben wiederholen sich oft:
*
System-Backups
*
Temporärdateien löschen
*
Antiviruschecks, etc.
Automatisierung dieser Aufgaben mit cron. Einmaliges Ausführen zu einem Zeitpunkt mit at.
Automatisierung mit cron
Für jeden Benutzer wird eine Liste von Befehlen zusammen mit den Zeitpunkten ihrer Ausführung verwaltet, die Cron-Tabelle, kurz crontab.
Ein Daemon-Prozess (crond) überprüft diese Tabellen jede Minute und führt die Befehle aus.
Der crontab-Befehl
Um die crontab zu verwalten existiert ein gleichnamiger Befehl:
crontab [optionen]
-l listet Tabelle auf
-r löscht crontab
-u benutzer verwendet crontab von benutzer (nur für root)
-e crontab verändern verwendet vi oder VISUAL
Beispiele: # crontab –l –u edp
zeigt Cron-Tabelle von Benutzer edp
# crontab –e
Ändern der eigenen crontab
Die crontab-Datei
Pro Zeile ein cron-Job
Kommentarzeilen möglich (#)
Pro Zeile 6 Felder (Leerzeichen = Trenner)
Minute Stunde Monatstag Monat Wochentag Befehl
1 2 3 4 5 6
Crontab-Felder
Nr Feldname mögliche Werte
1 Minute 0-59
2 Stunde 0-23
3 Monatstag 1-31
4 Monat 1-12 oderjan, feb, mar,…,dec
5 Wochentag 0-6 oder sun,mon,…,sat
Beispiel
28 07 * * * meinprogramm
Führt das Programm meinprogramm um 07:28 aus.
Das * steht für alle erlaubten Werte dieses Felds. Listenangaben möglich; Bereiche möglich
Beispiel
*/8 * * * * meinprogramm
Führt das Programm meinprogramm alle 8 Minuten aus.
Beispiel
30 9,12,15 * * mon-fri meinprogramm Ausführung von Montags bis Freitags um 9.30h, 12.30h und 15.30h
crontab-Zugriff sperren
Benutzerzugriff sperren/erlauben:
/etc/cron.allow und /etc/cron.deny
Pro Zeile ein Benutzer.
cron.allow vorhanden
Nur dort eingetragene Benutzer dürfen Cron benutzen.
cron.deny vorhanden
Nur dort nicht eingetragene Benutzer dürfen Cron benutzen.
Keine von beiden vorhanden? Jeder Benutzer darf Crons anlegen.
Die Systemcrontab
System-Cron-Tabelle unter: /etc/crontab
Wird direkt editiert (kein crontab –e !)
Zusätzliches 7. Feld: Benutzerkennung (unter der der Befehl ausgeführt wird)
Beispiel:
00 12 01 04 * edp make_jokes
crontab-Tipp!
Erinnerungshilfe für das Format der Zeitangaben!
Folgende Kommentarzeile in die eigene crontab aufnehmen:
# 0-59 0-23 1-31 1-12 0=sun-6=sat Befehl
Der at-Befehl
Um einen Befehl genau einmal zu einem bestimmten Zeitpunkt auszuführen verwendet man das at-Kommando.
Aufruf:
at uhrzeit
at –f befehlsdatei uhrzeit
Führt Befehle zur angegebenen Uhrzeit aus. Die Befehle werden interaktiv eingegeben oder in die Befehlsdatei geschrieben.
Beispiele
# at 13:45
find / -iname „*.bak“
ls -al /tmp
(STRG-D)
# at –f befehle.sh 13:45
Mögliche Zeitangaben:
HH:MM z.B. 10:45
HH:MM TT.MM.JJ z.B. 12:00 11.04.2004
now
now + mm minutes
now + hh hours
now + dd days
now + ww weeks
Beispiele
# at 11:45 startet die eingegebenen Befehle am heutigen Tag um 11:45
# at 09:00 3.7.05 startet die Befehle um 9 Uhr am 3.7.2005
# at now + 10 minutes startet die Befehle in 10 Minuten
at-Job Verwaltung
at-Jobs auflisten (at-queue) atq
at-Jobs löschen (at-remove) atrm job-nummer
Die job-nummer erhält man vorher über das atq-Kommando.
at-Zugriff sperren
Benutzerzugriff sperren/erlauben:
/etc/at.allow und /etc/at.deny
Pro Zeile ein Benutzer.
at.allow vorhanden
1.
> Nur dort eingetragene Benutzer dürfen
at.deny vorhanden
1.
> Nur dort nicht eingetragene Benutzer dürfen
Keine vorhanden
1.
> Nur der Systemadministrator root darf
Wohin mit der Ausgabe?
Kommandos, die über cron/at gestartet werden haben kein Terminalfenster zur Ausgabe. → Die Ausgabe der Befehle wird per Email zugeschickt.
Probleme ergeben sich bei…
* langen Ausgaben
* häufiger Ausführung
Lösung: Ausgabe unterdrücken oder in Datei umlenken (Programmoption oder Shell-Umlenkung >)
Beispiel (crontab-Eintrag):
00 12 * * * find / -iname „*.tmp“ >/tmp/meineFindAusgabe.txt
Leitet die (lange) Ausgabe des find-Befehls in die angegebenen Datei um und sendet sie nicht als Email an den Benutzer.
Umgebungsvariablen
Programme sind oft auf Umgebungsvariablen angewiesen. Besonderer Fall PATH sorgt dafür, dass ein Programm gefunden wird.
Problem: Programmdatei in der cron-Tabelle muss gefunden werden
Lösung: PATH-Variable (bzw. andere Umgebungs-variable) explizit vorher setzen.
Beispiel
Eigenes Skript in /home/edp/skripte/backup_db
crontab-Eintrag 00 12 * * * backup_db
→ Fehler weil backup_db nicht im Suchpfad
Lösung:
crontab-Eintrag 00 12 * * * /home/edp/skripte/backup_db
oder
00 12 * * * PATH=/home/edp/skripte:$PATH;backup_db