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 |
|
UDP soketini ss ile bulma |
|
TCP dinleyicisini lsof ile bulma |
|
Süreçleri fuser ile bulma |
|
TCP dinleyicisini netstat ile bulma |
|
| Bir süreci inceleme | |
| Yönetilmeyen bir süreci durdurma | |
fuser ile SIGTERM gönderme |
|
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
-
Port görünüyor ama süreç adı eksik:
sudoyetkileriyle komutu tekrar çalıştırın. Kök yetkileri olmadan, diğer kullanıcıların sahip olduğu soketler hakkında detayları okuyamayabilirsiniz. -
sskomutu 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
-lunpkullanın. Dinleyici başka bir ağ ad alanında (network namespace) veya konteynerde de olabilir, bu nedenle uygulamayla aynı ortamda kontrol edin. -
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.
-
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_REUSEPORTseçeneğini kullanabilir. Ana hizmeti tanımlayın ve çalışanları tek tek durdurmak yerine grubu yönetin. -
netstat: komut bulunamadı:Çoğu modern dağıtımda
net-toolspaketi yüklü değildir. Bunun yerinesskullanı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.


