Vorlesung "UNIX"

von Prof. Jürgen Plate

4. Kommandos zur Prozeß- und Systemverwaltung

Bei UNIX muß man Prozessen, die vom Terminal aus gestartet wurden, nicht unbedingt warten, bis der Prozeß terminiert, bis man das nächste Programm starten kann. Der Prozeß kann vielmehr im Hintergrund ablaufen, während sich der Benutzer anderen Arbeiten zuwendet. Mit dem Druckerspooler haben wir schon einen Hintergrundprozeß kennengelernt - wenn auch von spezieller Art.

Jetzt erscheint auch die Notwendigkeit des ps-Kommandos unter anderem Licht - man kann sich so über laufende Hintergrundprozesse informieren. Bei neueren Versionen greift das ps-Kommando nicht mehr auf die Prozeßtabelle des Schedulers zu, sondern es gibt ein Pseudo-Dateisystem /proc, in dem alle Infos über die Prozesse abgelegt sind. In der Regel werden Hintergrundprozesse abgebrochen, wenn sich der Benutzer am Terminal abmeldet (Logoff), denn sie sind ja Kindprozesse des aktuellen Shell-Prozesses. Es gibt jedoch Möglichkeiten, Prozesse auch nach dem Logoff "am Leben" zu erhalten. UNIX kennt recht mächtige Möglichkeiten für Hintergrundprozesse:

4.1 Hintergrundprozesse

Der Start eines Prozesses im Hintergrund erfolgt durch anhängen eines "&" an die Befehlszeile. Alle Kommandoeingaben bleiben wie vorher - auch der Ersetzungsmechanismus der Shell wirkt nach wie vor. Ebenso möglich sind Pipes. Zum Beispiel:

find / -user markus -print &
2354

Es wird die Nummer (PID) des neu erzeugten Prozesses ausgegeben (2354) und die Shell meldet sich sofort wieder mit dem Eingabeprompt. So wie das Kommando oben eingegeben wurde, hat es aber noch einen Nachteil:
Alle Ausgaben von find, auch die Fehlerausgaben, gelangen nach wie vor auf den Bildschirm, was u. U. die Arbeit im Vordergrund empfindlich stört. Durch Ein-/Ausgabeumleitung kann der Hintergrundprozeß zum Schweigen gebracht werden:

find / -user markus -print > liste 2> /dev/null &
2354

Eigenschaften von Hintergrundprozessen:

Weitere Kommandos für den Start von Hintergrundprozessen sind:

nice [-increment] Kommando &

Kommando zum Ausführen eines Hintergrundprozesses mit niedrigerer Priorität. increment gibt an, um wieviel die Priorität des Prozesses herabgesetzt werden soll (Voreinstellung: 10). Der Superuser kann Prozesse auch mit höherer Priorität laufen lassen, indem er ein negatives Increment angibt.

nohup Kommando &

(No Hang Up) Dieses Kommando ermöglicht es, einen Prozeß nach dem Logoff weiterlaufen zu lassen. Wenn die Ausgaben nicht explizit umgelenkt wurden, werden Standardausgabe und Standard-Fehlerausgabe in die Datei nohup.out im zuletzt aktuellen Verzeichnis geschrieben. Sollte dies nicht möglich sein (Zugriffsrechte nicht ausreichend), wird nohup.out im Home-Directory des Benutzers angelegt. Bei einigen Anlagen gibt es das Kommando "batch" mit analogen Eigenschaften.

4.2 Löschen von Prozessen

kill [-Signalnummer] Prozeßnummer(n)

Mit diesem Kommando kann der Benutzer eigene Prozesse löschen (auch im Vordergund laufende Prozesse - von einem anderen Terminal aus oder aus einem anderen X-Fenster heraus). Der Superuser kann jeden Prozeß löschen. Dem Prozeß wird das Signal mit der beim kill-Aufruf angegebenen Nummer gesendet (Voreinstellung: 15). Fängt der Prozeß das Signal nicht ab, wird er terminiert.
Über die in der Parameterzeile angegebenen Nnummer(n) werden die Prozeßnummer(n) der zu löschenden Prozesse angegeben. Wird hier eine 0 angegeben, so sind alle Prozesse des Benutzers zu löschen.

Neben anderen können für kill folgende Signalnummern verwendet werden:

0 SIGKILL Terminate (beim Beenden der shell)
1 SIGHUP Hangup (beim Beenden der Verbindung zum Terminal oder Modem)
2 SIGINT Interrupt (wie Ctrl-C-Taste am Terminal)
3 SIGQUIT Abbrechen (Beenden von der Tastatur aus)
9 SIGKILL Kann nicht abgefangen werden - Beendet immer den empfangenden Prozeß
15SIGTERM Terminate (Software-Terminate, Voreinstellung)

Die Datei /usr/include/Signal.h enthält eine Liste aller Signale. Später wird das Kommando "trap" besprochen, mit dem man innerhalb von Shell-Skripts gezielt auf einzelne Signale reagieren kann.

4.3 Kommandos zur Zeitsteuerung

at zeit [datum] [+incr]

at [-rl] [nummer]

Veranlaßt die Ausführung von Kommandos, die über die Standardeingabe eingegeben werden, zu einem angegebenen Zeitpunkt, auch wenn der Benutzer zu diesem Zeitpunkt nicht angemeldet ist. at stützt sich dabei auf das Programm atrun, das in regelmäßigen Zeitabständen gestartet wird (in der Regel alle 5 Minuten). Das Kommando gibt die Auftragsnummer und den Zeitpunkt der Ausführung aus. Die Ausgabe der Kommandos (sofern nicht umgeleitet wurde) wird dem Benutzer per mail-Kommando zugestellt. Die auszuführenden Kommandos werden von der Standardeingabe gelesen (d. h. in den folgenden Zeilen, abgeschlossen mit CTRL-D oder per Eingabeumleitung). Die Benutzung dieses Kommandos kann explizit erlaubt oder verboten werden. Die aktuelle Umgebung wird für die at-Prozesse übernommen. Es gibt zwei besondere Aufrufe:

at -r Auftragsnummer(n) Löscht den genannten Auftrag
at -l [Auftragsnummer(n)] Listet die noch auszuführenden Aufträge

Fehlt bei at -l die Nummer, werden alle Aufträge gelistet.

Optionen:

zeit
Ausführungszeitpunkt in der Form SSMM. Werden nur zwei Ziffern angegeben, sind dies die Stunden. Ist der Zeitpunkt bereits überschritten, erfolgt der Start des Prozesses zum angegebenen Zeitpunkt des nächsten Tages. Für die Zeit sind auch folgende Angaben möglich: "noon" für Mittag, "midnight" für Mitternacht und "now" für "jetzt" (siehe "increment").

datum
Datumsangabe für den Start des Prozesses in der Form "Monat Tag", oder "Monat Tag, Jahr". Für den Monat werden dreibuchstabige Kürzel verwendet: Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec. Für das Datum können auch die Angaben "today" oder "tomorrow" verwendet werden. Beispiele: "Feb 28", "Oct 15" oder "Feb 28,1991".
incr
Relative Zeitangabe, bestehend aus einer Zahl, gefolgt von einem der Begriffe: "minutes", "hours", "days", "weeks", "years". Um zum Beispiel einen Prozeß in 3 Stunden starten, gibt man an: at now +3 hours

Enschränkung des at-Kommandos

Die Verwendung des Kommandos kann auf einen bestimmten Benutzerkreis eingeschränkt werden. Dazu dienen zwei Dateien, usr/lib/cron/at.allow und usr/lib/cron/at.deny.

Ein Beispiel für das at-Kommando: Am 1. Oktober um 22 Uhr wird das Ausdrucken einer langen Datei gestartet.

at 2200 Oct 1
lp -m superlangedatei.txt
CTRL-D

job 545900100.a at Tue Oct 1 22:00:00 1991

Mit at -r 545900100.a könnte man den o. g. Job wieder löschen.

crontab [-erl]

Das Crontab-Kommando erstellt bzw. bearbeitet eine Auftragsdatei für den cron-Daemon. Der crond wird nur einmal beim Systemstart aufgerufen. Er prüft in regelmäßigen Abständen (normalerweise jede Minute) den Inhalt der crontab-Dateien, in denen Zeitpunkte für automatisch ablaufende Programme festgelegt sind. Mit dem Kommando crontab kann jeder Benutzer eine crontab-Datei anlegen und ändern (-e), löschen (-r) oder auflisten (-l). Zum Ändern wird der voreingestellte Editor (ed oder vi) gestartet (die Festlegung erfolgt durch die Variable EDITOR). Die Ausgabe der Kommandos, bei denen keine Ausgabeumleitung erfolgte, wird über mail an den Benutzer gesendet.

Format der crontab-Datei:

Jede Zeile der crontab-Datei enthält sechs Felder (durch Leerzeichen getrennt). Die ersten fünf Felder sind eine Zeitangabe, das sechste enthält das auszuführende Kommando. Die fünf Zeit-Felder sind folgendermaßen aufgebaut:

Statt einer expliziten Zahlenangabe sind auch folgende Angaben möglich:

Einige Beispiele dazu:

0 0 * * * Jeden Tag um Mitternacht
0 9 * * 1Jeden Montag um 9 Uhr
30 10 1 * 1Jeden Monatsersten und jeden Montag um 10 Uhr
30 0,30 8-18 * * *Täglich alle halbe Stunde aber nur zwischen 8 und 18
0,5,10,15,20,25,30,35,40,45,50,55 * * * *Alle 5 Minuten

Wie beim at-Kommando kann auch die Benutzung von crontab für bestimmte Benutzer gesperrt werden. Dazu dienen die Dateien /usr/lib/cron/cron.allow und /usr/lib/cron/cron.deny, bei denen das gleiche Schema angewendet wird, wie es schon beim at-Kommando besprochen wurde.

Die Tabellen (crontabs) stehen je nach UNIX-Variante in /etc/cron.d oder /usr/lib/cron. Beim Erstellen von cron- und at-Jobs sollte man sich nicht darauf verlassen, daß außer ein paar Standardvariablen irgendwelche Voreinstellungen verwendbar sind. Benutzen Sie entweder nur absolute Pfade oder eine explizite Pfad-Definition. Will man keinen Output per E-Mail erhalten, muß der Output (stdout und stderr) umgeleitet werden (Man kann den Job sehr schnell von E-Mail auf Dateiausgabe umstellen, indem man alle Kommandozeilen mit geschweiften Klammern einrahmt und dahinter die Ausgabeumleitung setzt: { .... } > Datei 2>&1). Will man nur wenige Kontrollausgaben erzeugen, lassen sich auch mittels echo >> logfile cron-Jobs loggen. Bei root-cron-Jobs kann dafür auch die allgemeine Logdatei /var/adm/messages (manchmal auch /var/log/messages) verwendet werden.

4.4 Wechsel der Benutzeridentität

Um die Benutzerindentität zu wechseln, ist nicht unbedingt ein Logoff mit nachfolgendem Logon nötig. Speziell der Superuser als Systemverwalter sollte üblicherweise als normaler Benutzer arbeiten und seine Sonderrechte nur dann einsetzen, wenn es nötig ist - schon um bei Fehlern den Schaden einzugrenzen.

su [-] [Name]

(Switch User) Der Benutzer arbeitet temporär unter einem neuen Benutzernamen. Er muß immer das Paßwort des neuen Benutzerkennzeichens angeben. Fehlt die Namensangabe, wird "root" (Superuser) angenommen (weshalb das Kommando irrtülich oft als "SuperUser" interpretiert wird). Es wird eine neue Shell eröffnet. Zurück zur alten Identität gelangt man durch beenden der Shell mit CTRL-D oder dem Kommando exit. Der Wechsel betrifft nur die effektive UID, die "reale" UID bleibt unverändert, ebenso das aktuellen Verzeichnis, Shell-Variablen, etc. Wird zusätzlich die Option '-' angegeben, dann wird auch die komplette Login-Prozedur (z. B. Ausführen von .profile) durchlaufen.

4.5 Dateisystem einbinden

UNIX erlaubt selbstverständlich die Verwendung mehrere Platten, Bandgeräte, Diskettenlaufwerke, etc., die alle in das Dateisystem eingebunden werden können.

mount [-a] [Gerätename] [Directory]

Anmelden (Montieren) eines Gerätes (Platte, Band, etc.). Das Directory (Mountpoint) muß als absoluter Pfadname angegeben werden. Ohne Angabe von Parametern erhält man eine Liste der montierten Platten. Die zum Zeitpunkt des Bootvorgangs einzubindenden Dateisysteme (in /etc/fstab (/etc/vfstab) aufgeführt) lassen sich mit mount -a einbinden. Lassen sich diese Systeme nicht automatisch einbinden (z. B. Diskette, Wechselplatte, CD-ROM, usw.), können sie später durch "mount Directory", z. B. mount /cdrom eingebunden werden, ohne daß eine Geräteangabe nötig ist, sofern sie in /etc/fstab aufgeführt sind. Je nach UNIX-Variante hat das mount-Kommando noch weitere Parameter, z. B. den Typ des Dateisystems oder Nur-Lese/Schreibzugriff. So lassen sich auch andere Typen von Dateisysteme "mounten", etwa unter Linux auch MS-DOS- oder Windows-Partitionen.

umount Gerätename

Abmelden einer Platte aus dem Dateisystem. Es darf kein Benutzer oder Prozeß mehr offene Dateien auf dieser Platte haben (am besten einmal 'cd' eingeben, bevor man die Platte abmeldet). Beim Abmelden werden auch alle Dateipuffer auf die Platte geschrieben. Wechseldatenträger (Diskette, Wechselplatte) unbedingt vor dem Herausnehmen abmelden. Übrigens: Das Kommando schreibt sich wirklich 'umount' - ohne 'n' hinter dem 'u'.

Natürlich gibt es noch weitere Kommandos für Dateisysteme, z. B. zum Partitionieren der Platte (bei Linux heißt es "fdisk", bei Sun-OS "format"). Eine neue Platte muß zuerst mit einem Dateisystem versehen ("formatiert") werden. Das Kommando dazu heißt "mkfs". Gebrauch und Parameter muß man der jeweiligen Dokumentation entnehmen. Zum Überpr&uum;fen der Platten gibt es das Kommando "fsck". Es wird normalerweise beim Booten automatisch ausgeführt. Für den Fall des manuellen Aufrufs sollte auch hier die Dokumentation des jeweiligen Systems konsultieren.

Disk-Quotas

Bei einem System mit vielen Benutzern sollte man sich als Administrator überlegen, ob man nicht Disk-Quotas einführt. Einzelne Benutzer können sonst die gesamte Festplatte, oder zumindest die Home-Partition mit Daten füllen und so die Arbeit aller anderen Anwender blockieren. Wenn Sie für das Home-Verzeichnis eine eigene Partition angelegt haben, so läuft das System zwar weiter, aber die User können es nicht mehr wie gewohnt nutzen. UNIX erlaubt Quotas für einzelne Benutzer oder für Gruppen. Die Beschränkungen gelten jeweils für eine einzelne Partition. Gruppenquotas geben die Summe des Speicherplatzes an, den alle Mitglieder dieser Gruppe gemeinsam belegen dürfen. Es lassen sich Obergrenzen für den belegten Plattenplatz und für die Anzahl der Dateien festlegen. Bei beiden Möglichkeiten können Sie zwei unterschiedliche Grenzen setzen:
Zum Inhaltsverzeichnis Zum nächsten Abschnitt
Copyright © FH München, FB 04, Prof. Jürgen Plate