Burada yanlış soruyu soruyorsun. Üzerini dinleyen soketi açan uygulamanın dışından bir portu kapatmak gerçekten mümkün değil. Bunu yapmanın tek yolu limana sahip olan süreci tamamen öldürmektir. Ardından, yaklaşık bir veya iki dakika içinde, bağlantı noktası tekrar kullanım için uygun hale gelecektir. İşte olanlar: (umursamıyorsanız, size belirli bir limana sahip olan süreci nasıl öldüreceğinizi gösterdiğim noktaya atlayın):
Limanlar, işletim sistemi tarafından farklı işlemlere tahsis edilen kaynaklardır. Bu, işletim sisteminden bir dosya işaretçisini istemeye benzer. Ancak, dosya işaretçilerinden farklı olarak, bir seferde yalnızca bir işlem bir bağlantı noktasına sahip olabilir. BSD soket arayüzü aracılığıyla, işlemler OS'nin daha sonra sağlayacağı bir porttan dinleme isteği yapabilir. İşletim sistemi aynı zamanda başka hiçbir işlemin aynı bağlantı noktasını almadığından emin olacaktır. Herhangi bir noktada, işlem soketi kapatarak bağlantı noktasını serbest bırakabilir. İşletim sistemi daha sonra bağlantı noktasını geri alacaktır. Alternatif olarak, işlem bağlantı noktasını serbest bırakmadan sona ererse, işletim sistemi sonunda bağlantı noktasını geri alacaktır (hemen gerçekleşmeyecek olsa da: birkaç dakika sürer).
Şimdi, ne yapmak istediğinizi (sadece bağlantı noktasını komut satırından kapatın), iki nedenden dolayı mümkün değildir. Birincisi, mümkün olsaydı, bir sürecin basitçe başka bir sürecin kaynağını (liman) çalması anlamına gelirdi. Ayrıcalıklı süreçlerle sınırlı olmadığı sürece, bu kötü bir politika olacaktır. İkinci sebep ise, devam etmesine izin verirsek, limanın sahip olduğu sürece ne olacağı belli değil. İşlemin kodu, bu kaynağa sahip olduğu varsayılarak yazılır. Basitçe elinden atsaydık, kendi başına çökmesine neden olacaktı, bu yüzden ayrıcalıklı bir süreç olsanız bile işletim sistemi bunu yapmanıza izin vermiyor. Bunun yerine, onları basitçe öldürmek zorundasınız.
Her neyse, işte belirli bir limana sahip olan bir süreci nasıl öldüreceğinizi:
sudo netstat -ap | grep :<port_number>
Bu, işlem tutma portuna karşılık gelen satırı verecektir, örneğin:
tcp 0 0 *:8000 *:* LISTEN 4683/procHoldingPort
Bu durumda, procHoldingPort , bağlantı noktasını açan işlemin adı, 4683 bunun ücreti ve 8000 (TCP olduğunu unutmayın), sahip olduğu bağlantı noktası numarasıdır.
Sonra son sütuna bakın, / göreceksiniz. Ardından şunu yürütün:
kill <pid>
Bu işe yaramazsa (netstat komutunu yeniden çalıştırarak kontrol edebilirsiniz). Bunu yap:
kill -9 <pid>
Genel olarak, eğer yapabiliyorsanız SIGKILL göndermekten kaçınmak daha iyidir. Bu yüzden size daha kill
önce denemenizi söyledim kill -9
. Sadece kullanarak kill
nazik SIGTERM gönderir.
Dediğim gibi, bunu yaparsanız portun yeniden açılması birkaç dakika sürecektir. Bunu hızlandırmanın bir yolunu bilmiyorum. Başka biri yaparsa, duymayı çok isterim.