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
Recente reacties