Dr. Linux
Komplizierte Organismen, wie Linux-Systeme es nun einmal sind, haben so ihre ganz eigenen Wehwehchen. Dr. Linux beobachtet die Patienten in den Linux-Newsgruppen, stellt an dieser Stelle Rezepte für aktuelle Probleme aus und alternative Heilmethoden vor.
Welches Programm hält das Laufwerk fest?
Nachdem ich eine CD mit Grafiken auf meinem Linux-Rechner angesehen hatte, hatte ich folgendes Problem: Beim Versuch, das CD-Laufwerk auszuhängen, kam die Fehlermeldung:
umount: /media/cdrom: Das Gerät wird momentan noch benutzt.
Wie bekomme ich heraus, welches Programm ein umount verhindert?
Dr. Linux: Ob auf einer grafischen Oberfläche die Fehlermeldung aus Abbildung 1 aufpoppt oder auf einer Kommandozeile die beschriebene Zeile bzw. die englische Version
umount: /media/cdrom: device is busy
erscheint – die Fahndung nach dem Prozess, der das Laufwerk bindet, leitet man ganz einfach mit dem Befehl lsof ("list open files"; liste offene Dateien auf) ein. Dieses Kommando lässt sich so vielseitig einsetzen, dass die passende Manpage über 2000 Zeilen enthält. Es ist in der Regel unter /usr/sbin zu finden – sofern Ihr Suchpfad dieses Verzeichnis nicht enthält, müssen Sie den Befehl statt mit einem einfachen lsof als /usr/sbin/lsof aufrufen.
Als Argument übergeben Sie ihm den Namen und ggf. den Pfad der Datei, von der Sie wissen wollen, welche Prozesse auf sie zugreifen; im Fall eines blockierten CD-Laufwerks die Pfadangabe der entsprechenden Gerätedatei. Ohne Angabe eines Beobachtungsobjekts präsentiert Ihnen lsof alle offenen Dateien Ihres Systems, eine Liste also, die Kurzgeschichtenlänge erreichen kann und nur in Ausnahmefällen nützlich ist.
Wenn Ihnen Windows-Laufwerksbuchstaben noch geläufig und Sie unsicher sind, wie genau Ihr CD-Laufwerk unter Linux heißt, schlagen Sie das schnell mit dem Befehl mount nach. mount ohne weitere Angaben listet alle derzeitig eingehängten Laufwerke auf, darunter selbstverständlich auch die CD, die sich nicht unmounten lässt:
perle@maxi:~> mount /dev/hda7 on / type ext3 (rw) […] /dev/hdb on /media/cdrom type iso9660 (ro,nosuid,nodev,user=perle)
Im Beispiel hängt das CD-ROM-Laufwerk als Slave am primären IDE-Controller (/dev/hdb), die auf der CD enthaltenen Daten sind unterhalb des Verzeichnisses /media/cdrom im Linux-Dateibaum einzusehen. Am Filesystem-Typ iso9660 erkennt man, dass es sich um eine Daten-CD handelt.
Ein lsof /dev/hdb sorgt nun für eine Ausgabe wie in Listing 1. Um zu erfahren, welche Prozesse auf Daten auf der CD zugreifen, schauen wir uns insbesondere die folgenden Ausgabespalten an:
- Die Spalte COMMAND gibt das zugreifende Kommando aus, eventuell auf neun Buchstaben verkürzt.
- PID enthält die Prozess-Identifikationsnummer, die man beispielsweise braucht, um den entsprechenden Prozess mit dem kill-Befehl ins Nirvana zu schicken.
- In der dritten, mit USER überschriebenen Spalte gibt lsof den Namen des Anwenders aus, der den Prozess angeschubst hat, unter Umständen lediglich dessen Benutzer-ID (UID).
Listing 1
Beispielausgaben von
lsofperle@maxi:~> lsof /dev/hdb COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME gs 1252 perle 3r REG 3,64 593581 47726 /media/cdrom/autoren.pfd
Wenn Sie unter COMMAND ein Programm finden, das Sie selbst gar nicht gestartet haben und der Sache vollständig auf den Grund gehen wollen, lohnt sich der Einsatz des Klassikers pstree. Dieses Kommando stellt Prozesse in Baumform dar, so dass Sie schnell den Überblick darüber bekommen, welche Prozesse welche anderen Prozesse gestartet haben. Mit der Option -p enthält die pstree-Ausgabe auch die jeweiligen PIDs in Klammern (Abbildung 2). Natürlich gibt es auf allen grafischen Oberflächen Programme zur Prozessverwaltung. Wenn Sie mit einem davon Freundschaft geschlossen haben, können Sie es selbstverständlich als Alternative zu pstree einsetzen, das auf allen, auch älteren, mit wenig Hauptspeicher ausgestatteten Systemen läuft.
Verhindern Prozesse das Aushängen der CD, die Sie unter Ihrer User-ID gestartet haben, können Sie sie mit dem Befehl kill und der jeweiligen PID als Argument abschießen. Reagiert der Prozess darauf nicht, setzen Sie ihm mit kill -9 die Pistole auf die Brust:
perle@maxi:~> kill -9 1252
Prozesse anderer User darf lediglich root abschießen; dass Sie mit root-Vollmachten ausgestattet besonders vorsichtig vorgehen sollten, ergibt sich dabei von selbst. Sobald der fragliche Prozess sein Leben ausgehaucht hat, steht einem umount der CD nichts mehr im Wege.
Läuft's oder läuft´s nicht?
Bei der Konfiguration von Diensten, die durch Daemonen gesteuert werden (zum Beispiel cron), finde ich in der Dokumentation häufig die Aufforderung, zu überprüfen, ob der jeweilige Daemon oder das Programm läuft. Wie stelle ich das schnell und einfach fest?
Dr. Linux: In der /var-Abteilung des Linux-Verzeichnisbaums finden Sie Daten, die sich schnell ändern können, ergo variabel sind. Dazu zählt auch die Information, ob ein bestimmter Daemon läuft. Wird er gestartet, erhält er (wie jeder andere Task auch) eine Prozess-ID, die jedoch anders als bei "normalen" Prozessen in einer Datei namens "name.pid" in /var/run verzeichnet wird. Damit wird verhindert, dass einer der Daemonen doppelt gestartet wird, und beim Herunterfahren des Systems ist sofort ersichtlich, welche Dienste beendet werden müssen.
Finden Sie einen auf einen Daemon passenden Eintrag in /var/run, können Sie im Normalfall davon ausgehen, dass der entsprechende Dienst gestartet ist (Listing 2). Natürlich kann es sein, dass er zum aktuellen Zeitpunkt gar nichts tut und sich nur die Zeit bis zu seinem nächsten Termin vertreibt; das ist abhängig von seiner Aufgabe und der jeweiligen Konfiguration.
Wenn Sie die Prozess-ID benötigen, schauen Sie sich den Inhalt der Datei am besten mit cat an – die Ausgabe beschränkt sich auf nur eine Zahl, so dass der Einsatz eines Pagers wie less zuviel des Guten wäre:
perle@maxi:/var/run> cat cron.pid 599
Der aktuell laufende Cron-Daemon trägt also die PID 599.
Listing 2
Die
.pid-Dateien in
/var/runenthalten die PIDs gestarteter Daemonen
perle@maxi:/var/run> ls -l insgesamt 112 -rw-r--r-- 1 root root 4 Mär 6 09:26 atd.pid -rw-r--r-- 1 root root 4 Mär 6 09:26 cron.pid -rw-r—– 1 root root 4 Mär 6 09:26 gpm.pid -rw-r--r-- 1 root root 4 Mär 6 09:26 inetd.pid -rw-r--r-- 1 root root 4 Mär 6 09:26 klogd.pid -rw-r--r-- 1 lp lp 4 Mär 6 09:26 lpd.printer -rw-r--r-- 1 root root 4 Mär 6 09:26 nscd.pid drwxr-x--T 2 root root 4096 Mär 6 10:18 sendmail -rw-r--r-- 1 root root 38 Mär 6 10:18 sendmail.pid drwxr-x— 2 root dialout 4096 Mär 6 09:26 smpppd -rw-r--r-- 1 root root 4 Mär 6 09:26 sshd.pid -rw-r--r-- 1 root root 4 Mär 6 09:26 syslogd.pid -rw-rw-r-- 1 root tty 3456 Mär 6 10:29 utmp -rw-r--r-- 1 root root 4 Mär 6 09:26 xfstt.pid […]
Eine weitere Möglichkeit, sich von der Lebendigkeit eines Programms zu überzeugen, steht mit dem Befehl pidof (bei SuSE im meist nicht im Benutzer-Pfad enthaltenen Verzeichnis /sbin abgelegt) zur Verfügung, einem Link auf das Programm killall5. Übergeben Sie pidof den Namen des gesuchten Programms, das in diesem Fall nicht einmal ein Daemon sein muss. Läuft es, erhalten Sie als Ausgabe seine PID; wurde es mehrfach gestartet, gibt pidof alle Prozess-Identifikationsnummern aus.
perle@maxi:~>/sbin/pidof /sbin/syslogd 337
Sollte pidof sich nach Ihrer Eingabe ausschweigen, haben Sie es mit einem Skript zu tun (oder mit etwas, das pidof für eines hält, wobei diese Einschätzung nicht stimmen muss). In diesem Fall geben Sie die Option -x mit an:
perle@maxi:~> /sbin/pidof -x kdeinit 1125 929 927 923 921 919 909 895 893 89



