Categories
Debian Linux RedHat Ubuntu

Prozess zu einem offenen Port ermitteln

Um den Prozess zu einem offenen Port zu finden gibt es verschiedene Möglichkeiten. Als Beispiel wollen wir für einen Port 5000 in Erfahrung bringen, welcher Prozess dahinter läuft.

Der erste Versuch könnte ein grep auf den Port mit ps -ef sein.

dockeradm@ubuntusrv001:~$ ps -ef|grep 5000
UID PID PPID C STIME TTY TIME CMD
root 80078 79851 0 14:42 ? 00:00:00 /usr/bin/docker-proxy -proto tcp -host-ip 0.0.0.0 -host-port 5000 -container-ip 172.17.0.2 -container-port 5000
root 80087 79851 0 14:42 ? 00:00:00 /usr/bin/docker-proxy -proto tcp -host-ip :: -host-port 5000 -container-ip 172.17.0.2 -container-port 5000

Dieser Ansatz ist nur ergfolgreich, wenn ein Prozess den Port als Argument übergeben bekommt. Das ist nur in wenigen Fällen so.

LSOF

lsof mit der Option -i gefolgt von :<PORT> werden die Prozess angezeigt, die diesen Port offen halten.
❗ Wenn man nicht der technische Benutzer ist, unter dem der Prozess läuft, sieht man keine Ausgabe:

dockeradm@ubuntusrv001:~$ lsof -i :5000
                                       

Mit sudo oder als Benutzer, dem der Prozess gehört, wird der Prozessnamen und die Prozess ID ausgegeben:

dockeradm@ubuntusrv001:~$ sudo lsof -i :5000
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
docker-pr 80078 root 4u IPv4 665614 0t0 TCP *:5000 (LISTEN)
docker-pr 80087 root 4u IPv6 660124 0t0 TCP *:5000 (LISTEN)

NETSTAT

netstat zeigt ebenfalls (angemeldet als technischer Benutzer unter dem der Prozess läuft oder als root) den Prozess und den Port an. Ist man nicht der technische Benutzer, so wird der Prozessname nicht ausgeben:

dockeradm@ubuntusrv001:~$ netstat -tulnp|grep 5000
(Not all processes could be identified, non-owned process info
will not be shown, you would have to be root to see it all.)
tcp 0 0 0.0.0.0:5000 0.0.0.0:* LISTEN -
tcp6 0 0 :::5000 :::* LISTEN -

Als Benutzer, dem der Prozess gehört oder als root sieht man auch den zugehörigen Prozess.

dockeradm@ubuntusrv001:~$ sudo netstat -tulnp|grep 5000
tcp 0 0 0.0.0.0:5000 0.0.0.0:* LISTEN 80078/docker-proxy
tcp6 0 0 :::5000 :::* LISTEN 80087/docker-proxy

Fazit

netstat erzeugt immer eine Ausgabe. Man erkennt zumindest, dass ein Prozess den Port belegt und man sieht den Status (CONNECTED/ LISTEN / …). ps und lsof zeigen bei fehlenden Berechtigungen unter Umstängen kein Ergebnis, obwohl ein Prozess den Port belegt.

Categories
Debian Korn Shell / Bash Linux RedHat Ubuntu

Welcher Prozess belegt wieviel Swap?

Wenn die Kommandos (in den Linux Varianten Debian, Ubuntu, RedHat und ähnlich)

  free
  cat /proc/swaps
  swapon -s

eine hohe Auslastung des Swap Spaces anzeigen, kommt die Frage nach dem Verbraucher des Swap hoch.

Folgendes Miniskript gibt die Liste der Prozesse nach Größe des belegten Swap an. Mit der Variable THRESHOLD kann man die Liste auf die Verbraucher eingrenzen, die mehr als diesen Wert in kB an Swap belegen.

  THRESHOLD=5000
  for pid in `ls /proc`; do
    vmswap=`awk '/VmSwa/{print $2}' /proc/${pid}/status 2>/dev/null`;
    if [ ${vmswap} -gt ${THRESHOLD} ];then
      pName=`ps -ef|awk '$2=="'"${pid}"'" {print $8}'`;
      echo "PID ${pid}: ${vmswap} kB (${pName})";
    fi;
  done 2>/dev/null|sort -un -k3

Die Ausgabe sieht wie folgt aus:

  PID 123857: 7826 kB (/usr/bin/python)
  PID 768456: 9876 kB (/usr/bin/java)
  PID 6543: 11392 kB (/usr/bin/python)
  PID 367682: 12420 kB (/usr/bin/python)

Categories
Korn Shell / Bash Shell Programmierung

Mehrfache Einträge in großen Konfigurationsdateien oder Protokollen finden (Linux/Unix Lösung)

Oft vermutet man in größeren Protokolldateien oder Konfigurationsdateien mehrfach vorhandene Einträge. Diese sollen schnell ermittelt und bei Bedarf entfernt werden.
Unter Linux gibt es das Werkzeug uniq. Der Parameter --count gibt alle Zeilen aus und die Häufigkeit Ihres Auftretens in der ersten Spalte. Es funktioniert nur nicht so intuitiv, wie erwartet. Ich versuche es an einem Beispiel:

uniq –count console.log

1 <?xml version=”1.0″ encoding=”UTF-8″ ?>
1 <Protokollzeile xxxyyyzzz >

Diese Datei hat offensichtlich zwei Zeilen insgesamt und beide unterscheiden sich. Das ist im Moment nicht sehr hilfreich. Daher verdoppele ich die Datei und füge eine einzeln vorkommende Zeile hinzu:

cat console.log >> consoleDup.log
cat console.log >> consoleDup.log
echo “Eine abweichende Zeile >> consoleDup.log

Eine erneute Überprüfung mit uniq zeigt das Problem:

uniq –count consoleDup.log

1 <?xml version=”1.0″ encoding=”UTF-8″ ?>
1 <Protokollzeile xxxyyyzzz >
1 <?xml version=”1.0″ encoding=”UTF-8″ ?>
1 <Protokollzeile xxxyyyzzz >
1 Eine abweichende Zeile

Genau, das wollten wir so nicht sehen. Die erste und dritte Zeile und die zweite und vierte Zeile sind identisch. Da sollte eine 2 stehen.
Aus dem gleichen Grund funktioniert uniq --unique nicht, solange die Datei nicht sortiert vorliegt. In den meisten Fällen (XML, JSON etc) Dazeien würde die Sortierung die Datei unbrauchbar machen.

Zur Lösung des Problems müssen die Zeilen sortiert werden.

sort consoleDup.log|uniq –count

1 Eine abweichende Zeile
2 <?xml version=”1.0″ encoding=”UTF-8″ ?>
2 <Protokollzeile xxxyyyzzz >

Schon besser. Der uniq Parameter --repeated gibt nur die mehrfach vorkommenden Zeilen aus:

sort consoleDup.log|uniq –count –repeated

2 <?xml version=”1.0″ encoding=”UTF-8″ ?>
2 <Protokollzeile xxxyyyzzz >
Doppelt oder noch häufiger vorkommende Zeilen in Textdaten können schnell und elegant mit awk entfernt werden:

awk ‘!seen[$0]++’ consoleDup.log >> console_noDupRecords.log
cat console_noDupRecords.log

<?xml version=”1.0″ encoding=”UTF-8″ ?>
<Protokollzeile xxxyyyzzz >

Eine Lösung für die Powershell zeige ich hier.