Linux'te Bir Portu Kullanan İşlemi Bulma Yöntemleri

Linux sistemlerinde 'bind: address already in use' hatası aldığınızda portu kullanan süreci nasıl bulacağınızı ve durduracağınızı adım adım öğrenin.

I
ITWISE
1 görüntülenme
Linux'te Bir Portu Kullanan İşlemi Bulma Yöntemleri

Giriş

Linux sistemlerinde bir hizmeti başlatmaya çalıştığınızda "bind: address already in use" gibi bir hata alırsanız, bu durum portun başka bir süreç tarafından kullanıldığını gösterir. Ancak hata mesajı size hangi sürecin portu kullandığını söylemez. Bu rehberde, Linux'te bir portu hangi sürecin kullandığını bulmak için kullanabileceğiniz ss, lsof, fuser ve netstat komutlarını detaylı olarak inceleyeceğiz. Ayrıca, bulduğunuz PID'ye göre süreci nasıl durduracağınızı da öğreneceksiniz.

Hızlı Başvuru Tablosu

Aşağıdaki tabloda, belirli bir portu kullanan süreci bulmak için kullanabileceğiniz komutları özet olarak bulabilirsiniz:

Görev Komut
TCP dinleyicisini ss ile bulma
sudo ss -ltnp 'sport = :80'
UDP soketini ss ile bulma
sudo ss -lunp 'sport = :53'
TCP dinleyicisini lsof ile bulma
sudo lsof -nP -iTCP:80 -sTCP:LISTEN
Süreçleri fuser ile bulma
sudo fuser -v 80/tcp
TCP dinleyicisini netstat ile bulma
sudo netstat -ltnp | grep ':80 '
Bir süreci inceleme
ps -fp PID
Yönetilmeyen bir süreci durdurma
sudo kill PID
fuser ile SIGTERM gönderme
sudo fuser -k -TERM 80/tcp

Tüm Dinleyici Portlarını Kontrol Etme

Belirli bir port yerine, sistemdeki tüm dinleyici portları listelemek isterseniz, Linux'te Dinleyici Portları Nasıl Kontrol Edilir rehberine göz atabilirsiniz.

1. Adım: Portu Kullanan Süreci Bulma

ss Komutu ile Süreci Bulma

ss (Socket Statistics) komutu, modern Linux dağıtımlarında varsayılan olarak kullanılan bir araçtır. iproute2 paketinin bir parçası olan ss, port numaralarını tam olarak eşleştirmeyi destekler ve çıktının başka bir komuta yönlendirilmesine gerek bırakmaz.

Komut:

sudo ss -ltnp 'sport = :80'

Çıktı Örneği:

State  Recv-Q  Send-Q  Local Address:Port  Peer Address:Port  Process
LISTEN 0      511     0.0.0.0:80          0.0.0.0:*          users:(("nginx",pid=1433,fd=6),("nginx",pid=1432,fd=6))
LISTEN 0      511     [::]:80             [::]:*             users:(("nginx",pid=1433,fd=6),("nginx",pid=1432,fd=6))

Komut Seçenekleri:

  • -l: Sadece dinleyen soketleri gösterir.
  • -t: TCP soketlerini gösterir.
  • -n: Port numaralarını hizmet adları yerine sayısal olarak gösterir.
  • -p: Her soketin sahibi olan süreci gösterir.

Not: sport = :80 ifadesi, yerel port 80 ile tam olarak eşleşir ve 8080 gibi diğer portları da dahil etmez. Çıktıda nginx sürecinin portu kullandığı görülmektedir. Process sütununda iki PID listelenmiştir çünkü ana süreç olan 1432 soketi açmış ve çalışan süreç olan 1433 ile paylaşmıştır. Her iki PID de aynı hizmeti göstermektedir.

UDP portlarını kontrol etmek için -t seçeneğini -u ile değiştirin. Örneğin, UDP port 53'ü kullanan süreci bulmak için:

sudo ss -lunp 'sport = :53'

lsof Komutu ile Süreci Bulma

lsof (List Open Files) komutu, ağ soketleri de dahil olmak üzere açık dosyaları listeler. TCP dinleyicilerini sayısal olarak göstermek ve filtrelemek için aşağıdaki komutu kullanabilirsiniz:

sudo lsof -nP -iTCP:80 -sTCP:LISTEN

Çıktı Örneği:

COMMAND  PID    USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
nginx   1432    root    6u  IPv4  28319      0t0  TCP *:80 (LISTEN)
nginx   1433 www-data  6u  IPv4  28319      0t0  TCP *:80 (LISTEN)

Komut Seçenekleri:

  • -nP: Hostname ve servis adı çözümlemesini engeller.
  • -iTCP:80: TCP port 80'u seçer.
  • -sTCP:LISTEN: Sadece dinleyen bağlantılar hariç tutulur.

UDP portlarını kontrol etmek için komut aşağıdaki gibi olacaktır:

sudo lsof -nP -iUDP:53

fuser Komutu ile Süreci Bulma

fuser komutu, port numarasını ve protokolünü belirterek süreci hızlıca bulmanızı sağlar. Örneğin, TCP port 80'ü kullanan süreci bulmak için:

sudo fuser 80/tcp

Çıktı Örneği:

80/tcp: 1432 1433

Detaylı çıktı için:

sudo fuser -v 80/tcp

Çıktı Örneği:

 USER       PID ACCESS COMMAND
80/tcp:    root     1432 F.... nginx
           www-data 1433 F.... nginx

Not: Aynı port numarası hem TCP hem de UDP için kullanılabileceğinden, mutlaka tcp veya udp belirtin.

netstat Komutu ile Süreci Bulma (Eski Sistemler için)

netstat komutu, net-tools paketinin bir parçasıdır ve eski sistemlerde kullanılabilir. TCP port 80'ü kullanan süreci bulmak için:

sudo netstat -ltnp | grep ':80 '

Çıktı Örneği:

tcp  0  0 0.0.0.0:80  0.0.0.0:*  LISTEN  1432/nginx: master

Not: netstat, ss ve lsof kadar detaylı çıktı vermez ve sadece bir süreci gösterir. UDP portlarını kontrol etmek için -lunp seçeneğini kullanın.

2. Adım: Süreci İnceleme ve Durdurma

Süreci İnceleme

Süreci durdurmadan önce, ne olduğunu anlamak önemlidir. Aşağıdaki komut ile sürecin tam komutunu ve üst PID'sini görüntüleyebilirsiniz:

ps -fp PID

Çıktı Örneği:

UID        PID  PPID  C STIME TTY          TIME CMD
root      1432     1  0 07:10 ?        00:00:00 nginx: master process /usr/sbin/nginx

Süreci Durdurma

Uyarı: Süreci durdurmadan önce ne yaptığını anladığınızdan emin olun. Bir veritabanı veya başka bir üretim hizmetini durdurmak, aktif çalışmaları kesintiye uğratabilir veya veri kaybına yol açabilir.

Eğer süreç bir servis yöneticisi (örneğin systemd) tarafından yönetiliyorsa, doğrudan PID'sini öldürmek yerine servisi durdurun:

sudo systemctl stop nginx

Eğer süreç yönetilmiyorsa, SIGTERM sinyali göndererek temiz bir şekilde durmasını sağlayabilirsiniz:

sudo kill PID

Eğer süreç SIGTERM sinyalini görmezden gelirse, son çare olarak SIGKILL gönderebilirsiniz:

sudo kill -KILL PID

Not: fuser komutunu kullanarak da süreci durdurabilirsiniz:

sudo fuser -k -TERM 80/tcp

3. Adım: Portun Serbest Kalıp Kalmadığını Kontrol Etme

Süreci durdurduktan sonra, portun serbest kalıp kalmadığını kontrol edin:

sudo ss -ltnp 'sport = :80'

Eğer çıktıda herhangi bir satır görünmüyorsa, port serbest bırakılmıştır.

Sık Karşılaşılan Sorunlar ve Çözümleri

  1. Port görünüyor ama süreç adı eksik:

    sudo yetkileriyle komutu tekrar çalıştırın. Kök yetkileri olmadan, diğer kullanıcıların sahip olduğu soketler hakkında detayları okuyamayabilirsiniz.

  2. ss komutu hiçbir şey döndürmüyor ama uygulama hâlâ çakışma bildiriyor:

    Doğru protokolü kullandığınızdan emin olun. TCP yerine UDP için -lunp kullanın. Dinleyici başka bir ağ ad alanında (network namespace) veya konteynerde de olabilir, bu nedenle uygulamayla aynı ortamda kontrol edin.

  3. Süreci durdurduktan sonra yeniden başlıyor:

    Bir servis yöneticisi veya konteyner runtime süreci yeniden başlatıyor olabilir. PID'sini öldürmek yerine systemd servisini, Docker konteynerini veya diğer yöneticileri durdurun veya yeniden yapılandırın.

  4. Aynı port için birkaç PID görünüyor:

    Bazı sunucular, bir ana süreç ve birkaç çalışan süreç kullanır ve bunlar aynı soketi paylaşabilir. Diğer uygulamalar SO_REUSEPORT seçeneğini kullanabilir. Ana hizmeti tanımlayın ve çalışanları tek tek durdurmak yerine grubu yönetin.

  5. netstat: komut bulunamadı:

    Çoğu modern dağıtımda net-tools paketi yüklü değildir. Bunun yerine ss kullanın.

Sonuç

Linux'te bir portu hangi sürecin kullandığını bulmak için öncelikle ss komutunu kullanın. Daha farklı bir görünüm için lsof veya fuser komutlarına başvurabilirsiniz. Özellikle üretim sistemlerinde, süreci durdurmadan önce PID'sini ve yöneticisini incelemeyi unutmayın.

Kaynak

Linuxize