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:
- Der "normale" Hintergrundprozeß
- Hintergrundprozeß mit reduzierter Priorität
- Batch-Prozesse (ohne Terminalanbindung)
- Zeitlich versetzteProzesse (Start zum festgelegten Zeitpunkt)
- Sich regelmäßigwiederholende Prozesse
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:
- Hintergrundprozesse sind Vordergrundprozessen gleichberechtigt, sie laufen
gleich schnell ab.
- Jedes Programm kann im Hintergrund ablaufen.
- Die Standardeingabe und -ausgabe ist weiterhin an das Terminal gebunden
(Umleitung nötig).
- Hintergrundprozesse (übrigens auch Vordergrundprozesse) können mit
dem kill-Kommando (siehe später) zwangsterminiert werden.
- Die Shell wartet nicht auf den Hintergrundprozeß, sondern ist sofort
wieder eingabebereit.
- Beim Logoff werden auch alle Hintergrundprozesse gekillt, sofern nicht
besondere Maßnahmen getroffen werden.
- Mit dem ps-Kommado kann man den Status der Prozesse ansehen.
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ß |
| 15 | SIGTERM | 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
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.
- Existiert nur at.allow, wird nur den dort eingetragenen
Benutzern die Verwendung des at-Kommandos erlaubt.
- Existiert nur at.deny, können alle dort nicht
eingetragenen Benutzer das at-Kommando verwenden. Ist die
Datei leer, dürfen es alle Benutzer verwenden.
- Existiert keine der beiden Dateien, darf nur der Superuser das
at-Kommando verwenden.
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:
- Ein Teilbereich, z. B. 1-5
- Eine durch Komma getrennte Liste, z. B.10,20,30,40,50
- Ein * (deckt den gesamten Bereich ab)
Einige Beispiele dazu:
| 0 0 * * * | Jeden Tag um Mitternacht |
| 0 9 * * 1 | Jeden Montag um 9 Uhr |
| 30 10 1 * 1 | Jeden 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]
(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) 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.
- Jede Platte enthält ein vollständiges Dateisystem.
- Die Koppelung erfolgt duch Ersetzen eines vorhandenen Verzeichnisses
durch das Dateisystem der eingebundenen Platte (der ursprüngliche
Inhalt des Verzeichnisses ist nicht mehr zugänglich).
- Austauschbare Datenträger dürfen nicht gewechselt werden,
solange das Dateisystem dieses Datenträgers eingebunden ist.
- Das ursprüngliche Dateisystem erweitert sich um die Dateien
und Verzeichnisse des neuen Datenträgers.
- Durch Abmelden wird das Dateisystem wieder aus dem Verzeichnisbaum entfernt.
- Es lassen sich auch Dateisysteme anderer Rechner einbinden (NFS = Network
File System).
- Dateisysteme, die beim Booten des Rechners eingebunden werden sollen, stehen
in der Datei /etc/fstab (oft auch /etc/vfstab).
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:
- Das Hard-Limit ist eine Grenze, die der Benutzer auf keinen Fall überschreiten
kann.
- das Soft-Limit darf der Benutzer eine bestimmte Zeit lang überschreiten, aber
nur bis zum Hard-Limit.
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.
- alle Dateien und Netzverbindungen, die ein bestimmter Prozess geöffnet hat,
- alle Prozesse, die eine bestimmte Datei oder Netzverbindung geöffnet haben oder
- die Namen aller Prozesse, die auf eine Netzverbindung warten.
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.
| Parameter |
Bedeutung |
| 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ä?g 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?amilie 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?D 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?D des jeweiligen Kindes enden.
Optionen:
- -d
- (debug) veranla? strap, zusätzliche Informationen über eigene Systemaufrufe und Signale auf den Standardfehlerkanal zu schreiben
- -t
- (time) lä? am Anfang jeder Protokollzeile die Zeit (Std:Min:Sec) ausgeben
- -f
- (follow) veranla? die Verfolgung von Kindprozessen des verfolgten Prozesses
- -o datei
- veranla? strace, das Protokoll in die Datei zu schreiben
- -s länge
- verändert die standardmä?g 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?ummer
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
Neben dem
/proc-Verzeichnis, das u.a. viele Informationen über die
Hardware enthält, finden sich unter Linux noch die folgenden Kommandos:
- dmesg listet alle Boot-Meldungen auf.
- lspci informiert über den PCI-Bus.
- lsusb informiert über die USB-Schnittstelle.
- lsmod listet alle geladenen Kernel-Module auf.
- pstree zeigt alle Prozesse als Baumstruktur an.
Zum Inhaltsverzeichnis
Zum nächsten Abschnitt
Copyright © FH München, FB 04, Prof. Jürgen Plate
Letzte Aktualisierung: 16. Oct 2004