Welke proces houd mijn tcp port vast (AIX)

  Algemeen

Het wil wel eens gebeuren dat je een applicatie wil starten en deze dan de melding geeft dat de port al bezet is. je kan een aantal methode gebruiken om uit te vinden welk proces de tcp port bezet houd. voor alle 3 de methode heb je root access nodig.

1. lsof (list open files)

persoonlijk zal ik zelf op een nieuwe systeem altijd een aantal tools extra installeren. lsof is er 1 van. helaas werk ik voor verschillende klanten en is lsof niet overal standaard geïnstalleerd en is het ook niet mogelijk om het te installeren. om met lsof alle processen te bekijken die aan een bepaalde poort hangen gebruikje de de -i optie. lsof word geinstalleerd middels een rpm en de default locatie is /opt/freeware/sbin

lsof -i tcp:22
COMMAND     PID   USER   FD   TYPE             DEVICE   SIZE/OFF NODE NAME
ssh      319668 sr0206    3u  IPv4 0xf100060002611b98    0t31545  TCP bla2.foo.bar:61505->bla0.foo.bar:ssh (ESTABLISHED)
ssh      339990 ab0362    3u  IPv4 0xf1000600023c7398    0t88505  TCP bla1.foo.bar:61385->bla0.foo.bar:ssh (ESTABLISHED)
sshd     401506 sr0206    3u  IPv4 0xf10006000245fb98    0t33377  TCP bla0.foo.bar:ssh->bla2.foo.bar:64350 (ESTABLISHED)
sshd     438412 en0852    3u  IPv4 0xf1000600020eab98    0t76641  TCP bla0.foo.bar:ssh->bla0.foo.bar:64330 (ESTABLISHED)

2. netstat in combinatie met rmsock

Geen lsof aanwezig en toch er achter te komen. gebruik netstat in combinatie met rmsock.

als eerste doe je. netstat -Aan | grep portnummer in het voorbeeld gebruik ik port 22 deze word normaal gesproken gebruikt voor de sshd.

$ netstat -Aan | grep 22       
f100020002036bb0 tcp4       0      0  *.22               *.*                LISTEN
f100020003ef43b0 tcp4       0      0  10.32.112.139.3581 10.32.196.23.22    ESTABLISHED
f100020002b4d3b0 tcp4       0      0  10.32.112.139.3562 10.32.12.105.22    ESTABLISHED

de lijst kan natuurlijk veel langer zijn.

Nu we de socket weten kunnen we het bij behorden proces id op vragen. met rmsock. (rmsock staat in /usr/sbin)

$ rmsock f100020002036bb0 tcpcb
The socket 0x2036808 is being held by proccess 319580 (sshd).

Note rmsock, de naam rmsock suggereert dat de socket word verwijderd. dat is niet het geval. Als de socket in gebruik is door een proces word alleen maar weergegeven welke proces id en welk proces de port vast houd. het 2de argument van rmsock geeft het protocol aan. in geval van een tcp port geef je tcpcb op.

3. netstat in combinatie met kdb

Wederom gebruik je netstat om het achter het socket id te komen.

$ netstat -Aan | grep 22       
f100020002036bb0 tcp4       0      0  *.22               *.*                LISTEN
f100020003ef43b0 tcp4       0      0  10.32.112.139.3581 10.32.196.23.22    ESTABLISHED
f100020002b4d3b0 tcp4       0      0  10.32.112.139.3562 10.32.12.105.22    ESTABLISHED

Nu gebruiken we kdb om proces id op te vragen. let op het proces id word nu in hex weer geven.

$ echo "sockinfo f100020002036bb0 tcpcb" | kdb |grep proc
F100080A00000000 F100080A10000000 pvproc+000000
proc/fd:  78/3
proc/fd: fd: 3
pvproc+013800   78*sshd     ACTIVE 004E05C 001703A 00000010146AA400   0 0001

het proces id in hex vind je op de laatste regel achter ACTIVE en de proces naam zie je nu ook al staan voor ACTIVE we moeten nu eerst het id omrekenen naar decimaal. dit kan je ook weer met kdb doen.

$ echo "hcal 004E05C"|kdb|grep Value                     
Value hexa: 0004E05C          Value decimal: 319580

je kan nu ook weer de proces list op vragen met ps.

$ ps -ef |grep 319580
root  319580   94266   0   Mar 26      -  0:00 /usr/sbin/sshd