Dienstag, 14. Juli 2009

Haengender ps -ef

Sollte der ps -ef einmal haengenbleiben und damit mit hoher Wahrscheinlichkeit auch kein Zugriff mehr auf alle files in /proc/ moeglich sein, gibt es folgende Moeglichkeit den betreffenden Prozess dennoch zu identifizieren:

cd /proc
for pid in *; do ls -ld $pid; done &
Das ampersand ist wichtig, sonst haengt die for-Schleife und blockiert die shell!
Die letzte ausgegebene PID merken, dann ein
echo *
und die darauf folgende PID suchen. Das ist der Kandidat.

Eigendlich waer es jetzt nett zu wissen welcher Prozess das ist. Doch leider wird ps -ef nicht funktionieren, daher muessen wir mdb benutzen:

# mdb -k
Loading modules: [ unix genunix specfs dtrace mac cpu.generic uppc pcplusmp scsi_vhci zfs sockfs ip hook neti sctp arp usba uhci s1394 stmf nca fctl lofs idm md cpc random crypto nfs fcip ptm nsctl ufs audiosup sd ipc ]
> ::ps ! grep 1563
R 1563 1 1453 1453 4100 0x4a004000 ffffff01dad47590 gvfs-hal-volume-
> ::quit

Dies funktioniert, da mdb nicht /proc/1563 oeffnet, sondern direkt in die (unter /proc liegenden) Kernel-Strukturen sieht.
Wir haben jetzt also den Prozess unserer Wahl und wissen jetzt vielleicht was zu tun ist.

Im konkreten Fall hatte ich einen haengenden ps aufgrund eines cputst Prozesses der die CPU4 testen wollte. Diese CPU war aber bereits zu 100% im sys aufgrund eines bugs im ICMP Treiber.

Es half dann wirklich den Prozess mit einem freundlichen kill -9 zu beenden, danach reagierte das System auf den ps -ef wieder normal.

Keine Kommentare: