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. Zum ANzeigen der Prozesse dient das schon früher erwähnte Kommando ps:

ps [optionen]

ps zeigt die Liste der laufenden Prozesse (Programme) an. Das Kommando ist insbesondere im Zusammenspiel mit kill sehr praktisch, um hängende Prozesse von Hand zu beenden. ps kennt zahllose Optionen, die auf den Man-Pages ausführlich beschrieben sind. Dort finden Sie auch Erklärungen dazu, was die zahlreichen Informationen bedeuten, die von ps ausgegeben werden. Im Gegensatz zu anderen Kommandos gibt es bei ps Optionen mit und ohne vorangehenden Bindestrich. Diese haben teilweise sogar eine unterschiedliche Bedeutung. (ps -a und ps a sind nicht gleichwertig!) Beide Optionstypen können in Gruppen gemischt werden, z. B. ps -A ul. Die wichtigsten der ca. 50 Optionen lauten: 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.

pstree [optionen] [pid]

pstree gibt einen Baum mit allen Prozessen auf dem Bildschirm aus. Der Baum macht deutlich, welcher Prozess von welchem anderen Prozess gestartet wurde. Wenn eine Prozessnummer angegeben wird, beginnt der Baum an dieser Stelle (sonst bei init, also dem ersten Prozess, der beim Systemstart ausgeführt wird).

top [Optionen]

Dies Kommando hat eine Ausgabe, die das gesamte Terminalfenster einnimmt. In den oberen Zeilen wird eine Gesamtstatistik aller Prozesse und der Speicherbelegung angezeigt. Darunter zeigt top alle fünf Sekunden die Liste aller laufenden Prozesse an, wobei die Prozesse nach ihrem Anteil an der Rechenzeit geordnet werden (die "fetten" Brocken ganz oben). Wenn beim Aufruf der optionale Parameter q angegeben wird, aktualisiert top die Liste ständig und beansprucht die gesamte freie Rechenzeit. Die Taste "q" beendet das Programm. Das Programm sollte nach Möglichkeit in einem eigenen Terminal(fenster) ausgeführt werden. Über weitere Parameter kann das Verhalten von top beeinflusst werden, z. B. nur eine einzige Ausgabe abgerufen oder nur die laufenden Prozesse angezeigt werden. Auch die Länge der Ausgabe kann man festlegen. top eignet sich besonders, wenn man das Verhalten eines Systems lägere Zeit beobachten will.

Jetzt erscheint auch die Notwendigkeit des ps-Kommandos unter anderem Licht - man kann sich so über laufende Hintergrundprozesse informieren. 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

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
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
*/5 * * * *Auch alle 5 Minuten

Des weiteren existiert zusätzlich für systemweite Jobs die Datei /etc/crontab, deren Syntax von der oben beschriebenen leicht abweicht. Nach der Zeitangabe folgt noch eine zusätzliche Spalte mit dem Namen des Users unter dessen Berechtigung der jeweilige Job ablaufen soll.

Aliase unter Linux:

AliasFunktionEntspricht
@rebootWird nach dem booten ausgeführt 
@hourlyEinmal in der Stunde0 * * * *
@dailyEinmal am Tagz. B. 0 0 * * *
@midnightEinmal am Tag um Mitternacht0 0 * * *
@weeklyEinmal in der Woche0 0 * * 0
@monthlyEinmal im Monat0 0 1 * *
@annuallyEinmal im Jahr0 0 1 1 *

Die Crontab-Dateien müssen immer mit dem crontab-Kommando bearbeitet werden, denn beim Systemstart werden die Dateien vom cron-Daemon eingelesen und dieser speichert die Zeitpunkte jeder einzelnen Aktion. Sollte sich an der Zeit der letzten Veränderung der Datei /etc/crontab etwas geändert haben, aktualisiert der cron-Daemon alle Änderungen in den cron-Verzeichnissen. crontab sorgt ebenfalls dafür, dass der cron-Daemon die Daten aktualisiert.

Wenn der cron-Daemon einen bestimmten Job zu einer Zeit ausführen soll, zu der der Rechner nicht angeschalten ist, dann verfällt dieser Job. Oft ist es der Fall, dass manche tägliche cron-Jobs um zwei oder drei Uhr ausgeführt werden sollen oder die wöchentlichen am Sonntag (Tag 0). Wenn ein Rechner aber weder Sonntags, noch Nachts läuft, werden diese Jobs niemals ausgeführt. In solchen Fällen kann anachron (siehe unten) helfen.

Die Benutzung von crontab kann für bestimmte Benutzer gesperrt werden. Dazu dienen die Dateien /usr/lib/cron/cron.allow und /usr/lib/cron/cron.deny, für die gilt:

Die Tabellen (crontabs) stehen je nach UNIX-Variante in /etc/cron.d oder /usr/lib/cron. Für allgemeine cron-Jobs existiert zusätzlich die oben erwähnte Datei /etc/crontab.

Beim Erstellen von cron-Jobs (und at-Jobs, siehe unten) 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.

Bei Linux gibt es noch Erweiterungen:
Erstens enthält die Datei /etc/crontab bereits Einträge und zweitens existieren zusätzlich die Verzeichnisse /etc/cron.daily, /etc/cron.weekly und /etc/cron.monthly. Dies soll dem ungeübten User den Umgang mit dem cron-Daemon erleichtern. Er muss einfach seine Shell-Scripte in das passende Verzeichnis kopieren und schon werden diese täglich, wöchentlich oder monatlich ausgeführt. Das ist auch der Grund, warum ein Linux-PC irgendwann nach dem Booten anfängt heftig zu arbeiten - da werden diese Scripte abgearbeitet (bevor der User wieder abschaltet).

anacron

anacron ist wie der cron-Daemon ein periodischer Kommandoscheduler. Er ist primär für Desktop-Rechner als Ergänzung zum cron-Daemon gedacht. Er führt bestimmte Befehle in Tages-Intervallen aus. Im Gegensatz zu crontab muss für anacron der Rechner nicht Tag und Nacht laufen.

Jedesmal, wenn anacron aufgerufen wird, liest es seine Konfigurationsdatei ein. Wenn ein Job die letzten n Tage nicht ausgeführt wurde, wobei n die angegebene Periode dieses Jobs ist, führt anacron ihn aus. Das Programm erzeugt jeweils einen Eintrag in einer speziellen Zeitmarkendatei, die es für jeden Job erstellt, so dass es immer weiss, wann der Job zuletzt ausgeführt wurde. anacron ist also kein Daemon, der die ganze Zeit läuft, sondern muss entweder über ein init-Script oder den cron-Daemon regelmässig gestartet werden.

Man kann einfach zeitgesteuerte Aufgaben in Intervallen von einem, sieben oder 30 Tagen starten um tägliche, wöchentliche oder monatliche Ausführung zu erzwingen. anacron führt seine Jobs aus, wenn der letzte Ablauf eines Jobs länger als die genannte Intervallzeit her ist. Somit wird ein Job auch dann ausgeführt, wenn der Rechner das nächste Mal angeschalten wird und nicht - wie bei crontab - wenn das nächste Wochen- oder Monatsende erreicht ist.

Jedesmal, wenn anacron aufgerufen wird, liest es seine Konfigurationsdatei /etc/anacrontab ein, in der die Aufgaben ähnlich wie bei crontab definiert sind. Wenn ein Job länger als die angegebene Perionde nicht ausgeführt wurde, führt anacron ihn aus. Das Programm erzeugt dann einen Eintrag in einer speziellen Zeitmarkendatei, die es für jeden Job erstellt, so dass es weiss, wann der Job zuletzt ausgeführt wurde. Wurden alle Kommandos ausgeführt, wird anacron beendet. anacron ist also kein Daemon, der die ganze Zeit läuft, sondern muss entweder über init-Scripts oder den cron-Daemon regelmässig gestartet werden.

Die Konfigurationsdatei von anacron ist sehr einfach aufgebaut. Sie enthält entweder Variablenzuweisungen, die der Umgebung zugewiesen werden, in der der entsprechende Befehl ausgeführt werden soll, oder Befehlszeilen der Form

    Periode   Delay   Job-Id   Kommando
Die Periode gibt die Anzahl von Tagen an, die mindestens zwischen der letzten Ausführung und der nächsten Ausführung des Jobs vergangen sein müssen. Dabei sind auch die Aliase @daily für 1, @weekly für 7 und @monthly für 30 zugelassen. Delay ist ein Wert in Minuten, der verwendet werden kann, damit nicht alle anacron-Jobs gleichzeitig gestartet werden und so den Rechner unnötig belasten. Die Job-Id ist ein beliebiges Wort, dass alle Zeichen ausser Leerzeichen und Schrägstrich enthalten darf. Mit Hilfe dieses Wortes wird der Dateiname der Zeitmarkendatei erstellt. Am Ende der Zeile steht dann der auszuführende Befehl. Die folgende /etc/anacrontab-Datei würde die die tägliche, wöchentliche und monatlichen cron-Jobs (siehe oben) ausführen:
  
SHELL=/bin/sh
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root

#period in days  delay in min.  job-identifier   command
 1                5	            cron.daily       nice run-parts /etc/cron.daily
 7               25	            cron.weekly      nice run-parts /etc/cron.weekly
@monthly         45	            cron.monthly     nice run-parts /etc/cron.monthly

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

Einschrä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.

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]

(Substitute 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 oder .bashrc) durchlaufen.

sudo [optionen] kommando

Bei einigen Distributionen, beispielsweise Ubuntu, ist das Login für root gesperrt. Um Root-Rechte zu erlangen muss man sich immer als unprevilegierter User einloggen und dann mit dem Kommando sudo arbeiten. sudo führt ein Kommando aus, als würde es von einem anderen Benutzer (voreingestellt ist auch hier wieder root) ausgeführt. Damit können auch "gewöhnliche" Benutzer administrative Aufgaben übernehmen bzw. systemkritische Kommandos ausführen, ohne dazu das Root-Passwort kennen zu müssen. Will man mehrere Kommandos als Root ausführen, erzeugt man sich am Besten mit sudo bash eine Root-Shell.

Bevor sudo die Ausführung eines Programms erlaubt, muss dieses Recht für einen bestimmten Benutzer und für ein bestimmtes Programm in der Datei /etc/sudoers angegeben werden. Zum Bearbeiten der Datei muss das Programm visudo eingesetzt werden, welches das gleichzeitige Ändern der Datei von mehren Stellen aus verhindert und die gröbsten Fehler erkennt. Es ist nicht zwangsläufig an den Editor vi gebunden, sondern verwendet das Programm, das durch den Inhalt der Variablen EDITOR festgelegt ist. Hier können nicht nur einzelne User berechtig werden, bestimmte oder alle Kommandos privilegiert auszuführen (wahlweise mit oder ohne Passworteingabe), sondern es lassen sich auch Privilegien für ganze Gruppen (z. B. "admin") vergeben.

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:

4.6 Weitere Informationskommandos

lsof

Dieses Kommando zeigt geöffnete Dateien, Verzeichnisse, Unixsockets und IP-Sockets (siehe Netzwerk-Kapitel) sowie Pipes an. Mit den passenden Optionen aufgerufen, zeigt es z.B. Wenn der User "root" das Kommando ohne Parameter aufruft, zeigt es alles, was von sämtlichen Prozessen geöffnet ist - und das ist eine Menge (oft über 1000 Zeilen):
COMMAND     PID     USER   FD   TYPE     DEVICE     SIZE       NODE NAME
init          1     root  cwd    DIR        3,2     4096          2 /
init          1     root  rtd    DIR        3,2     4096          2 /
init          1     root  txt    REG        3,2    27844    1782394 /sbin/init
init          1     root  mem    REG        3,2    90210     196307 /lib/ld-2.2.5.so
init          1     root  mem    REG        3,2  1153784     196310 /lib/libc-2.2.5.so
init          1     root   10u  FIFO        3,2             2339761 /dev/initctl
keventd       2     root  cwd    DIR        3,2     4096          2 /
keventd       2     root  rtd    DIR        3,2     4096          2 /
keventd       2     root   10u  FIFO        3,2             2339761 /dev/initctl
ksoftirqd     3     root  cwd    DIR        3,2     4096          2 /
ksoftirqd     3     root  rtd    DIR        3,2     4096          2 /
ksoftirqd     3     root   10u  FIFO        3,2             2339761 /dev/initctl
kswapd        4     root  cwd    DIR        3,2     4096          2 /
kswapd        4     root  rtd    DIR        3,2     4096          2 /
kswapd        4     root   10u  FIFO        3,2             2339761 /dev/initctl
bdflush       5     root  cwd    DIR        3,2     4096          2 /
bdflush       5     root  rtd    DIR        3,2     4096          2 /
bdflush       5     root   10u  FIFO        3,2             2339761 /dev/initctl

...

lsof      27430     root    2u   CHR      136,1                   3 /dev/pts/1
lsof      27430     root    3r   DIR        0,3        0          1 /proc
lsof      27430     root    4r   DIR        0,3        0 1797652488 /proc/27430/fd
lsof      27430     root    5w  FIFO        0,6             7473007 pipe
lsof      27430     root    6r  FIFO        0,6             7473008 pipe
lsof      27431     root  cwd    DIR        3,2     4096    3662907 /home/plate
lsof      27431     root  rtd    DIR        3,2     4096          2 /
lsof      27431     root  txt    REG        3,2   108956    1831546 /usr/sbin/lsof
lsof      27431     root  mem    REG        3,2    90210     196307 /lib/ld-2.2.5.so
lsof      27431     root  mem    REG        3,2  1153784     196310 /lib/libc-2.2.5.so
lsof      27431     root    4r  FIFO        0,6             7473007 pipe
lsof      27431     root    7w  FIFO        0,6             7473008 pipe
Mit den passenden Parametern kann man die Ausgabe auf die interessierenden Zeilen eingrenzen. Gibt man mehrere Filterkriterien an, so zeigt lsof diejenigen Zeilen an, die entweder mindestens eine oder (wenn man zusätzlich -a angibt) alle Bedingungen erfüllen.

Datei(en)
Zugriffe auf diese Datei(en) anzeigen. Beispiel: Wer benutzt gerade bash?

# lsof /bin/bash
COMMAND   PID     USER  FD   TYPE DEVICE   SIZE    NODE NAME
bash    19041 holzmann txt    REG    3,2 511400 2322044 /bin/bash
bash    21620     root txt    REG    3,2 511400 2322044 /bin/bash
bash    26921    plate txt    REG    3,2 511400 2322044 /bin/bash
bash    26937     root txt    REG    3,2 511400 2322044 /bin/bash

+D Verzeichnis
Zugriffe auf die Dateien unterhalb des Verzeichnisses anzeigen. Beispiel: Wer arbeitet mit Dateien im /home-Verzeichnis?

# lsof +D /home
COMMAND   PID  USER   FD   TYPE DEVICE SIZE    NODE NAME
bash    26921 plate  cwd    DIR    3,2 4096 3662907 /home/plate
bash    26937  root  cwd    DIR    3,2 4096 3662907 /home/plate
lsof    27890  root  cwd    DIR    3,2 4096 3662907 /home/plate
lsof    27891  root  cwd    DIR    3,2 4096 3662907 /home/plate

+p PIDs
Alles anzeigen, was die Prozesse mit diesen PIDs geöffnet haben. Um mehrere PIDs anzugeben, diese mit Komma trennen. Will man die Prozesse namentlich angeben, verwendet man lsof -c [name]. Beispiel: Welche Dateien benötigt meine Shell?

# ps
  PID TTY          TIME CMD
26937 pts/1    00:00:00 bash
27899 pts/1    00:00:00 ps

# lsof +p 26937
COMMAND   PID USER   FD   TYPE DEVICE    SIZE    NODE NAME
bash    26937 root  cwd    DIR    3,2    4096 3662907 /home/plate
bash    26937 root  rtd    DIR    3,2    4096       2 /
bash    26937 root  txt    REG    3,2  511400 2322044 /bin/bash
bash    26937 root  mem    REG    3,2   90210  196307 /lib/ld-2.2.5.so
bash    26937 root  mem    REG    3,2  248132  196280 /lib/libncurses.so.5.2
bash    26937 root  mem    REG    3,2    8008  196313 /lib/libdl-2.2.5.so
bash    26937 root  mem    REG    3,2 1153784  196310 /lib/libc-2.2.5.so
bash    26937 root  mem    REG    3,2   40152  196316 /lib/libnss_compat-2.2.5.so
bash    26937 root  mem    REG    3,2   69472  196315 /lib/libnsl-2.2.5.so
bash    26937 root    0u   CHR  136,1               3 /dev/pts/1
bash    26937 root    1u   CHR  136,1               3 /dev/pts/1
bash    26937 root    2u   CHR  136,1               3 /dev/pts/1
bash    26937 root  255u   CHR  136,1               3 /dev/pts/1

-u user[,user...]
Alles anzeigen, was die Prozesse geöffnet haben, die einem der angegebenen Usernamen oder User-ID gehören. Um mehrere User anzugeben, diese mit Komma trennen. Beispiel: Welche Dateien werden zurzeit von Plate benutzt?

# lsof -u plate
COMMAND   PID  USER   FD   TYPE DEVICE    SIZE    NODE NAME
bash    26921 plate  cwd    DIR    3,2    4096 3662907 /home/plate
bash    26921 plate  rtd    DIR    3,2    4096       2 /
bash    26921 plate  txt    REG    3,2  511400 2322044 /bin/bash
bash    26921 plate  mem    REG    3,2   90210  196307 /lib/ld-2.2.5.so
bash    26921 plate  mem    REG    3,2  248132  196280 /lib/libncurses.so.5.2
bash    26921 plate  mem    REG    3,2    8008  196313 /lib/libdl-2.2.5.so
bash    26921 plate  mem    REG    3,2 1153784  196310 /lib/libc-2.2.5.so
bash    26921 plate  mem    REG    3,2   40152  196316 /lib/libnss_compat-2.2.5.so
bash    26921 plate  mem    REG    3,2   69472  196315 /lib/libnsl-2.2.5.so
bash    26921 plate    0u   CHR  136,1               3 /dev/pts/1
bash    26921 plate    1u   CHR  136,1               3 /dev/pts/1
bash    26921 plate    2u   CHR  136,1               3 /dev/pts/1
bash    26921 plate  255u   CHR  136,1               3 /dev/pts/1
...

-i [TCP|UDP][@host][:ports]
Die Netzverbindungen des übergebenen Hosts und Ports anzeigen. Dabei kann der Host wahlweise als Hostname oder IP-Adresse und die Ports als Portnummern oder Servicenamen angegeben werden. Um mehrere Ports zu betrachten, kann man Listen (z.B. ssh,www) oder Bereiche (z.B. 1-1024) angeben. Beispiel: Welche Prozesse kommunizieren da auf Port 80 miteinander?

menetekel:/home/plate# lsof -i :80
COMMAND   PID USER   FD   TYPE  DEVICE SIZE NODE NAME
apache  11299 root   18u  IPv4 7063707       TCP *:www (LISTEN)
apache  26057 root   18u  IPv4 7063707       TCP *:www (LISTEN)
apache  26960 root   18u  IPv4 7063707       TCP *:www (LISTEN)
apache  26961 root   18u  IPv4 7063707       TCP *:www (LISTEN)
apache  27026 root   18u  IPv4 7063707       TCP *:www (LISTEN)
apache  27037 root   18u  IPv4 7063707       TCP *:www (LISTEN)
apache  27038 root   18u  IPv4 7063707       TCP *:www (LISTEN)
apache  27383 root   18u  IPv4 7063707       TCP *:www (LISTEN)
apache  27402 root   18u  IPv4 7063707       TCP *:www (LISTEN)
apache  27427 root   18u  IPv4 7063707       TCP *:www (LISTEN)
apache  27919 root   18u  IPv4 7063707       TCP *:www (LISTEN)

strace, ltrace

strace schaltet sich zwischen einen Benutzerprozeß und den Kernel und protokolliert alle Aktivitäten an dieser Schnittstelle. Wenn der verfolgte Prozeß einen Systemaufruf macht, gibt strace den Namen, die Argumente des Aufrufs und den Rückgabewert dieses Systemaufrufs aus. Wenn der verfolgte Prozeß ein Signal erhält, gibt strace den Namen des Signals aus.
Falls ein Systemaufruf mit einem Fehler zurückkehrt, wird, wenn vorhanden, die dem Fehlerstatus zugeordnete Fehlermeldung angezeigt. Zeichenketten als Argumente eines Systemaufrufs werden nur bis zu einer bestimmten Länge ausgegeben. Standardmäßig ist dieser Wert auf 32 Zeichen eingestellt. Wenn eine Zeichenkette länger als der eingestellte Wert ist, werden die fehlenden Zeichen durch zwei Punkte angedeutet.

Es ist möglich, einen einzelnen Prozeß oder eine ganze Prozeßfamilie zu verfolgen. Wenn die von einem verfolgten Prozeß erzeugten Kindprozesse auch verfolgt werden, setzt die Protokollierung erst ein, nachdem der das Kind erzeugende Systemaufruf zurückkehrt und die ProzeßID des Kindes an den Elternprozeß zurückgibt. Zu diesem Zeitpunkt kann der Kindprozeß bereits Systemaufrufe gemacht haben, die dann nicht protokolliert sind.
Wenn strace zu einem bereits laufenden Prozeß hinzugeschaltet wird, können nur solche Kindprozesse verfolgt werden, die nach dem Hinzuschalten erzeugt werden.
Sie können das Protokoll auch in eine Datei schreiben lassen. Wenn Sie die Kinder des verfolgten Prozesses auch verfolgen, werden die Protokolle für die Kindprozesse in separaten Dateien gespeichert, deren Namen mit dem für den Stammprozeß gewählten übereinstimmen und auf die ProzeßID des jeweiligen Kindes enden. Optionen:

-d
(debug) veranlaßt strap, zusätzliche Informationen über eigene Systemaufrufe und Signale auf den Standardfehlerkanal zu schreiben
-t
(time) läßt am Anfang jeder Protokollzeile die Zeit (Std:Min:Sec) ausgeben
-f
(follow) veranlaßt die Verfolgung von Kindprozessen des verfolgten Prozesses
-o datei
veranlaßt strace, das Protokoll in die Datei zu schreiben
-s länge
verändert die standardmäßig auf 32 Zeichen beschränkte Länge der Ausgabe von Zeichenketten als Argument eines Systemaufrufs
-p prozess-id
schaltet strace zum laufenden Prozeß mit der Prozeßnummer prozess-id hinzu; ohne Rootprivilegien können Sie nur Ihre eigenen Prozesse verfolgen.

ltrace leistet Ähnliches wie strace in Bezug auf die Verwendung von dynamischen Bibliotheken (Libraries) durch Prozesse.

ldd

Dieses Kommando listet alle Bibliotheken auf, die ein Programm benötigt (also im Gegensatz zu ltrace statisch). Zum Beispiel:
$ ldd /bin/bash
        libncurses.so.5 => /lib/libncurses.so.5 (0x40017000)
        libdl.so.2 => /lib/libdl.so.2 (0x40055000)
        libc.so.6 => /lib/libc.so.6 (0x40059000)
        /lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x40000000)

uname

gibt Auskunft über Betriebssystem und Hardware. Optionen:
-s
zeigt den Betriebssystemnamen (Voreinstellung, wenn keine Option angegeben wird)
-n
zeigt den Netzwerknamen des Systems
-r
zeigt die Release (Versionsnummer) des Betriebssystems
-v
zeigt das Erstellungsdatum des Betriebssystems
-m
zeigt den Prozessortyp
-a
zeigt alle der oben genannten Daten
Beispiel:
$ uname -a
Linux menetekel 2.4.18-bf2.4 #1 Son Apr 14 09:53:28 CEST 2002 i686 unknown

free

Zeigt die Speicherbelegung an. Zum Beispiel:
$ free
             total       used       free     shared    buffers     cached
Mem:        512960     506016       6944          0      51296     387396
-/+ buffers/cache:      67324     445636
Swap:       497972       1740     496232

uptime

Zeigt die Zeit seit dem letzten reboot und die aktuelle Last an, z. B.:
$ uptime
 17:09:18 up 143 days, 59 min,  3 users,  load average: 0.07, 0.07, 0.07

Weitere Informationskommandos unter Linux

Systeminfos

Die Hardware eines Rechners ist für manchen Anwender ein Buch mit sieben Siegeln. Zwar liefert Linux eine Fülle von Informationen über die verbauten Komponenten - allerdings nicht unbedingt in einer leicht verständlichen Form. Unter /proc befinden sich beim klassischen Unix nur Informationen zu Prozessen. Bei Linux findet man jedoch noch einiges mehr. Die Informationen können ganz einfach z. B. per cat-Kommando auf der normalen Konsole angezeigt werde, da es reine (Pseudo-)Textdateien sind. Bei /proc handelt es sich nämlich um ein virtuelles Dateisystem, das der Kernel anlegt und in dem die laufenden Prozesse in Unterverzeichnisse abgebildet werden. Es beansprucht keinerlei Platz auf der Festplatte, auch wenn manche Dateien scheinbar eine enorme Größe aufweisen. Allerdings erleichtert das Proc-Verzeichnis durch eine Vielzahl von Unterverzeichnissen und teilweise auch mit vieldeutigen Verzeichnisnamen die Suche nach spezifischen Informationen nicht gerade. Auch sind nicht alle Dateien bei jeder Hardware zu finden. Unter anderem finden Sie:

/proc/cpuinfo Informationen zur CPU (u.a. Name, Taktfrequenz, Cache-Größe)
/proc/meminfo Informationen über den Arbeitsspeicher (u.a. Gesamtgröße, Cache, Swap)
/proc/partitions Informationen über Partitionen des Massenspeichers (u.a. Partitionsname,
Anzahl der Blöcke)
/proc/modules Übersicht über die geladenen Module (u.a. Name, Speicheradresse)
/proc/devices Übersicht über vorhandene Char- und Block-Devices
/proc/version Informationen über die Kernelversion
/proc/loadavg aktuelle Systemauslastung
/proc/stat Prozesse
/proc/interrupts Übersicht über Interrupts
/proc/net/dev Statistik der Netzwerkgeräte (u.a. übertragene Bytes, Fehler)
/proc/bus Informationen und Übersichten über die Busse im Rechner.
/proc/bus/*/devicesÜbersichten über die jeweiligen Geräte des Bus
/proc/ide Hier finden sich die IDE-Geräte
/proc/ide/*/model Die Modellbezeichnung des Geräts
/proc/acpi/thermal-zone/THRG/temperatureCPU-Temperatur
/proc/acpi/battery/BAT?/stateBatteriezustand
/proc/acpi/ibm/fanLüfterstatus
/proc/<PID>/cmdlineKommandozeile des Prozesses mit der Nummer PID

Das Programm "Hardinfo" bereit dem Durcheinander durch eine ansprechende grafische Oberfläche und eine übersichtliche Präsentation der Hardware-Informationen ein Ende. Hardinfo steht unter der GPL und kann von http://freshmeat.net/projects/hardinfo heruntergeladen werden. Danach entpacken Sie das Archiv zunächst in ein temporäres Verzeichnis:

tar xjvf hardinfo-w.x.y.z.tar.bz2
beziehungsweise
tar xzvf hardinfo-w.x.y.z.tar.tar.gz
(w.x.y.z steht für die gerade aktuelle Version). Dann wechseln Sie in das neu angelegte Verzeichnis und richten das Programm mit dem übliche Dreisprung
./configure && make && make install
ein. Versuchen Sie es vorher auf jeden Fall mit dem Paketmanager Ihrer Distribution - das geht einfacher und schneller. Bei Debian ist es beispielsweise schon verfügbar und kann mittels apt-get install hardinfo eingerichtet werden.

Sysstat-Paket

Das Paket sysstat ist bei Linux und einigen anderen UNIX-Derivaten eine Sammlung von Kommandozeilen-Tools, die einen schnellen Überblick des Systems verschaffen. Die Kommandos bilden ein Frontend zum Linux-Kernels, und können daher auch nur Daten ausgeben, die der Kernel liefert - sie sammeln keine Daten darüber hinaus!

iostat

iostat liefert Status-Informationen über den Datendurchsatz der Festplatten, der angeschlossenen NFS-Laufwerke und der CPUs. Zum Beispiel:
# iostat
Linux 2.6.32-5-686 (info)       19.09.2011      _i686_  (4 CPU)

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
           0,02    0,00    0,01    0,01    0,00   99,97

Device:            tps   Blk_read/s   Blk_wrtn/s   Blk_read   Blk_wrtn
sda               0,26         0,45         3,97     281194    2507152
iostat besitzt zahreiche Optionen, unter anderem:
-dAnzeige nur der Festplatten-Daten.
-cAnzeige der reinen CPU-Daten.
-pAnzeige der IO-Daten je Partition.
-nAnzeige der NFS-IO-Daten.
-xErweiterte Anzeige der Festplatten-Daten.
-t ZahlAngabe, nach wie vielen Sekunden die Anzeige aktualisiert werden soll.

mpstat

mpstat dient der Analyse der Prozessor-Auslastung und liefert eine aussagekräftigere Info als uptime. Ohne Option wird eine Standardübersicht gezeigt, die an die Ausgabe von iostat angelehnt ist:
# mpstat
Linux 2.6.32-5-686 (info)       19.09.2011      _i686_  (4 CPU)

18:08:03     CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest   %idle
18:08:03     all    0,01    0,00    0,01    0,01    0,00    0,00    0,00    0,00   99,97
Mit der Option -A wird die Ausgabe erweitert: die Statistiken werden pro Prozessor/Core angezeigt, ausserdem werden die Interrupts pro Sekunde pro Prozessor angezeigt. Gibt man am Ende der Kommandozeile eine Zahl N an, läft mpstat dauernd und aktualisiert die Anzeige alle N Sekunden.

pidstat

Dieses Kommando dient der Analyse einzelner Prozesse. Der Aufruf ohne Optionen zeigt eine Liste aller Prozesse an, z. B.:
# pidstat
Linux 2.6.32-5-686 (info)       19.09.2011      _i686_  (4 CPU)

18:14:04          PID    %usr %system  %guest    %CPU   CPU  Command
18:14:04            1    0,00    0,00    0,00    0,00     1  init
18:14:04            4    0,00    0,00    0,00    0,00     0  ksoftirqd/0
18:14:04            9    0,00    0,00    0,00    0,00     2  migration/2
18:14:04           10    0,00    0,00    0,00    0,00     2  ksoftirqd/2
18:14:04           12    0,00    0,00    0,00    0,00     3  migration/3
18:14:04           15    0,00    0,00    0,00    0,00     0  events/0
18:14:04           16    0,00    0,00    0,00    0,00     1  events/1
18:14:04           17    0,00    0,00    0,00    0,00     2  events/2
18:14:04           18    0,00    0,00    0,00    0,00     3  events/3
18:14:04           24    0,00    0,00    0,00    0,00     0  sync_supers
18:14:04           25    0,00    0,00    0,00    0,00     1  bdi-default
18:14:04           37    0,00    0,00    0,00    0,00     0  kseriod
18:14:04           46    0,00    0,00    0,00    0,00     3  khungtaskd
18:14:04          217    0,00    0,00    0,00    0,00     0  scsi_eh_1
18:14:04          306    0,00    0,00    0,00    0,00     0  kjournald
18:14:04          356    0,00    0,00    0,00    0,00     2  udevd
18:14:04          494    0,00    0,00    0,00    0,00     2  edac-poller
17:02:32         2889    0,00    0,00    0,00    0,00     0  kdeinit4
   ...
Die Option -C gestattet die Spezifizierung der zu untersuchenden Prozesse. Mit -p kann statt des Prozess-Namens die PID definiert werden. Beispiel:
# pidstat -C bash
Linux 2.6.32-5-686 (info)       19.09.2011      _i686_  (4 CPU)

18:16:12          PID    %usr %system  %guest    %CPU   CPU  Command
18:16:12         3675    0,00    0,00    0,00    0,00     2  bash
18:16:12         3726    0,00    0,00    0,00    0,00     1  bash
Mit der Option -d werden I/O-Statistiken zu den Prozessen angezeigt und -r verschafft einen Überblick der Speicherauslastung. Auch hier kann durch eine Zahl am Ende ein Dauerbetrieb initiiert werden.

sar

Da die oben beschriebenen Kommandos jeweils nur einen Schnappschuss der Systemleistung wiedergeben, kann mit sar ein Status-Logging erreicht werden. Das Programm nimmt via Cron-Job z. B. alle 5 Minuten verschiedene Leistungsdaten des Systems auf und speichert diese ab. sar kennt wieder zahllose Optionen, einen Überblick gibt die Manual-Seite. Aös Konfigurationsdatei dient /etc/default/sysstat.

Nützliche Programme

Die folgenden Programme geben Auskunft über verschiedene Systemdatenm laufende Prozesse, die Rechnerauslastung, das Netzwerk usw.

free Arbeitsspeicherverwendung, s. o.
df Speicherplatz auf gemounteten Geräten
uptime Anzeige der Systemlast und der Uptime, s. o.
hostname Anzeige des Hostname
date Systemzeit anzeigen
uname OS-Namen anzeigen
ifconfig Informationen über Netzwerkgeräte (nur als root)
iwconfig desgleichen für WLAN-Benutzer
top kurze Systeminformationen (Last, Speicher, etc.) und Anzeige der Prozesse z. B. top -b -n 1
htop die noch komfortablere version von top
ps Anzeige der Prozesse
pstree Anzeige der Prozesse in Baumform
hddtemp Zeigt die Temperatur von SMART-fähigen Festplatten an
acpi Bietet eine komfortable Schnittstelle zu ACPI
dmesg Alle Systemstart-Informationen des Kernels (u.a. auch die Erkennung der Hardware)
iptraf Viele Möglichkeiten zur Überwachung des IP-Verkehrs
lsof list open files, siehe oben
lsmod Module auflisten
lspci PCI-Bus auflisten
lsusb USB-Devices auflisten
lsattr Dateisystem-Attribute auflisten
netstat Informationen über Netzwerkverbindungen, Routingtabelle, etc. z. B. netstat -nt (alle tcp-Verbindungen), netstat -nlt (alle Serverprozesse)
arp -navaktuelle ARP-Tabelle
nmap Portscanner
route eingetragene Routen
mount eingebundene Dateisysteme
last Tabelle der letzten Logins
lastb Tabelle der letzten fehlgeschlagenen Logins (nur als root)

Zum Inhaltsverzeichnis Zum nächsten Abschnitt
Copyright © Hochschule München, FK 04, Prof. Jürgen Plate