Linux'ta belirli bir bağlantı noktasında çalışan bir işlem nasıl öldürülür?


761

Tomcat'i ./shutdown.shtomcat /bindizininden kullanarak kapatmaya çalıştım . Ancak sunucu düzgün kapatılmadı bulundu. Ve böylece yeniden başlayamadım
Tomcat'im limanda çalışıyor 8080.

Devam eden tomcat sürecini öldürmek istiyorum 8080. Önce hangi işlemin öldürüleceğini seçmek için belirli bir bağlantı noktasında (8080) çalışan işlemlerin listesine sahip olmak istiyorum.


Yanıtlar:


936

Bu fuser 8080/tcpişlem, o bağlantı noktasına bağlı işlem PID'sini yazdırır.

Ve bu fuser -k 8080/tcpo süreci öldürecek.

Yalnızca Linux üzerinde çalışır. Daha evrensel olanı lsof -i4(veya IPv6 için 6'dır).


2
bu 8080'e bağlı bir soketi de kapatıyor mu?
fer y

9
Bağlantı noktasını düzgün kapatmaz. Üst işlem öldürüldükten sonra bağlantı noktası TIME_WAIT durumuna geçirilir. İşletim sistemi daha sonra yaklaşık 60 saniye sonra bağlantı noktasını tamamen kapatacaktır. Bu, bağlantı noktasını en az 60 saniye boyunca yeniden kullanamayacağınız anlamına gelir (sokete yeniden kullanma seçeneği vermediğiniz sürece).
Mark Lakata

2
Darwin, farklı bir sürümünü kullanıyor olmalıdır fuser. Sadece bir dosya alır, desteklemez -k.
ap

3
'fuser -k -n tcp 8080' de süreci öldürecek
Hesham Yassin

7
@dbliss kaynaştırıcı psmisc'nin bir parçasıdır. fuser: command not foundAlmanız durumunda psmisc'i yükleyin. CentOS / RHEL 7 için, koşsudo yum install psmisc
Tom

699

8080 bağlantı noktasını dinleyen herhangi bir işlemi listelemek için:

lsof -i:8080

8080 numaralı bağlantı noktasını dinleyen herhangi bir işlemi öldürmek için:

kill $(lsof -t -i:8080)

veya daha şiddetli bir şekilde:

kill -9 $(lsof -t -i:8080)

( -9Karşılık gelir SIGKILL - terminate immediately/hard killsinyali: bkz öldür Sinyallerin listesi ve öldürme komuta -9 seçeneği amacı nedir? Sinyal için belirtilirse. kill, SÜRE sinyali aka -15veya soft killbazen öldürmek için yeterli değildir gönderilir, bir süreç.).


9
kill: kullanım: kill [-s sigspec | -n signum | -sigspec] pid | jobspec ... or kill -l [sigspec] Komutlarınızı uyguladığımda bunu alıyorum
Sudhir Belagali

2
@SudhirBelagali süper kullanıcı ile yaptısudo
Marcel Djaman


2
Eklemek istiyorum, bazen işlem kimliğini görmek için izniniz yok, bu durumda yapmanız gerekir sudo lsof -i:8080.
Akavall

1
neden ikinci ipuçları daha şiddetli?
Webwoman

281

Komutu kullanın

 sudo netstat -plten |grep java

kullanılan grep javaolarak tomcatkullanımları javada işlemleri gibi.

Bağlantı noktası numarası ve işlem kimliğine sahip işlemlerin listesini gösterecektir

tcp6       0      0 :::8080                 :::*                    LISTEN      
1000       30070621    16085/java

önceki sayı /javabir işlem kimliğidir. Şimdi killişlemi öldürmek için komutu kullanın

kill -9 16085

-9 Sürecin zorla öldürüleceğini ima ediyor.


11
İşlem adlarını almak için kök ayrıcalıklara gereksinim duyabileceğinizi eklemek isteyebilirsiniz netstat.
Jonas Schäfer

2
@JonasWielicki sahip olduğunuz kök ayrıcalıkları olmayanları görebilirsiniz.
dbliss

Netstat için root ayrıcalıklarına ihtiyacım vardı. Sürecin nereden geldiğini bilmenin bir yolu var mı? Tüm uygulamaları kapattığımı söyleyebildiğim kadarıyla, işlemleri yanlışlıkla bir arka plan görevine ittiğim bir terminal penceresinden gelmiş olabilir. Belki de önce tüm işlemleri görmek için 'ps' terminal komutunu çalıştırmalıydım ...
JesseBoyd

150

Belirli bir bağlantı noktasında yalnızca LISTEN'i öldürmek için bu tek astarı eklerdim:

kill -9 $(lsof -t -i:3000 -sTCP:LISTEN)


9
Bence bu en iyi cevap olmalı. @Gal Bracha
Sam Kah Chiin

2
Tarayıcımı da öldürmediği için bu en iyi çözüm!
Russo

En iyi cevap! Basit, özlü ve işi doğru yapıyor.
Çar Bomba

116

Lsof komutunu kullanabilirsiniz. Buradaki port numarası 8090 olsun

lsof -i:8090

Bu komut, bu bağlantı noktasındaki açık işlemlerin bir listesini döndürür.

Gibi bir şey…

COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
ssh 75782 eoin 5u IPv6 0x01c1c234 0t0 TCP localhost:8090 (LISTEN)

Bağlantı noktasını boşaltmak için işlemi kullanarak işlemi sonlandırın (işlem kimliği 75782'dir)…

kill -9 75782

Bu benim için çalıştı. İşte orijinal yazının linki : link


1
süreci zorla öldürmek için -9 gibi öldürmek -9 75782 gerekir; bazen birkaç işlem sadece öldürmekle öldürülmez
veer7

73

8080 numaralı bağlantı noktasında çalışan bir işlemi öldürmek istiyorsanız, önce 8080 bağlantı noktası işlem tanımlama numarasını (PID) bulmanız ve sonra öldürmeniz gerekir. 8080 bağlantı noktası numarası PID'sini bulmak için aşağıdaki komutu çalıştırın:

sudo lsof -t -i:8080

Buraya,

  • sudo - yönetici ayrıcalığı isteme komutu (kullanıcı kimliği ve şifre).
  • lsof - dosya listesi (İlgili işlemleri listelemek için de kullanılır)
  • -t - yalnızca işlem kimliğini göster
  • -i - yalnızca internet bağlantılarıyla ilgili işlemi göster
  • : 8080 - sadece bu port numarasındaki işlemleri göster

Böylece aşağıdaki komutu kullanarak PID'nizi kolayca öldürebilirsiniz:

sudo kill -9 <PID>

Buraya,

  • kill - işlemi öldürme komutu
  • -9 - zorla

Aşağıdaki komutu kullanarak belirli bir bağlantı noktasındaki bir işlemi öldürmek için bir komut kullanabilirsiniz:

sudo kill -9 $(sudo lsof -t -i:8080)

Daha fazla bilgi için aşağıdaki bağlantıyı görebilirsiniz : Linux'ta belirli bir bağlantı noktasında bir işlem nasıl öldürülür


teşekkürler dostum. sudo kill -9 $(sudo lsof -t -i:8080)benim için çalıştı
Junaid


41

Bu, üzerinde çalışan her şeyin işlem kimliklerini basmak için yazdırır <port_number>:

fuser -n tcp <port_number> 

Ayrıca stderr'a bazı şeyler yazdırır, bu yüzden:

fuser -n tcp <port_number> 2> /dev/null

Daha sonra şu işlem kimliklerini killkomuta sağlayabiliriz :

sudo kill $(fuser -n tcp <port_number> 2> /dev/null)

Bunu çok fazla yaparsanız bir işleve de koyabilirsiniz:

function killport() {
    sudo kill $(fuser -n tcp $1 2> /dev/null)
}

35

Görevin PID'sini alın ve öldürün.

lsof -ti:8080 | xargs kill

Cevap için teşekkürler. Mac OS'de çok sorunsuz çalışır. Sen en iyisin. Hemen Oy Verin.
AMIC MING

1
Bağlantı noktası aralıkları ile de iyi çalışır lsof -ti:8080-8089 | xargs kill.
dvlsg

34

Belirli bir bağlantı noktasında çalışan hizmet pidini bilmek için:

netstat -tulnap | grep :*port_num*

bu sürecin açıklamasını alacaksınız. Şimdi kill veya kill -9 pid kullanın. Kolayca öldürülür.

Örneğin

netstat -ap | grep :8080

tcp6       0      0 :::8080       :::*    LISTEN      1880/java 

Şimdi:

kill -9 1880

Tüm komutları şu şekilde çalıştırmayı unutmayın: root


29

Bir astar

kill -9 $(lsof -t -i tcp:8080)

burada açıklama: lsof and kill

root@localhost:~# lsof -i tcp:8080
COMMAND   PID USER   FD   TYPE  DEVICE SIZE/OFF NODE NAME
java    23672 sine  238u  IPv6 3028222      0t0  TCP localhost:http-alt (LISTEN)

pid seçin ve kullanın kill

kill 23672


16

Bağlantı noktası numarasını seçin ve grep'i netstat komutuna aşağıda gösterildiği gibi uygulayın

netstat -ap | grep :7070

Konsol Çıkışı

tcp 0 0 ::: 7070 ::: * DİNLE 3332 / java

PID'ye (İşlem Kimlik Numarası) dayalı olarak hizmeti öldürün

kill -9 3332

13
  1. lsof -i tcp:8000 Bu komut, bağlantı noktası 8000'de çalışan işlemle ilgili bilgileri listeler

  2. kill -9 [PID] Bu komut işlemi öldürür


Sadece birkaç hafta önce kazara bunu indirdiğimi fark ettim, eğer anwer'ınızı biraz düzenlerseniz kaldırabilirim
Robin-Hoodie

12

Linux : Bağlantı noktasını biliyorsanız öncelikle bu komutun PID'sini bulabilirsiniz:

netstat -tulpn 

misal:-

 Local Address  Foreign Address  State    PID/Program name

  :::3000       :::*             LISTEN    15986/node 

Sonra öldürme sürecini gerçekleştirirsiniz. aşağıdaki komutu çalıştırın:

öldürmek -9 PID

Örnek: -

öldür -9 15986


10

Linux : Bağlantı noktasını biliyorsanız bu komutu kullanabilirsiniz:

netstat -plten | grep LISTEN | grep 8080

AIX :

netstat -Aan | grep LISTEN | grep 8080

Daha sonra ilk sütunu alırsınız (örnek: f100050000b05bb8) ve aşağıdaki komutu çalıştırın:

rmsock f100050000b05bb8 tcpcb

öldürme süreci.


10

Sen bilebilir çalışan tüm limanların listesini onun ayrıntıları (pid, adres vs.) ile birlikte sistemde:

netstat -tulpn

Aşağıdaki komutta bağlantı noktası numarasını sağlayarak belirli bir bağlantı noktası numarasının ayrıntılarını öğrenebilirsiniz :

sudo netstat -lutnp | grep -w '{port_number}'

örnek: sudo netstat -lutnp | grep -w '8080' Ayrıntılar aşağıdaki gibi sağlanacaktır:

Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name

pid kullanarak bir işlemi öldürmek istiyorsanız :kill -9 {PID}

port numarasını kullanarak bir işlemi öldürmek istiyorsanız :fuser -n tcp {port_number}

kullanmak sudoherhangi erişmek mümkün değilse.


6

kill -9 `fuser 8080/tcp|xargs -n 1`, bu komutlar 8080 numaralı bağlantı noktasını TCP bağlantısıyla dinleyen işlemi de öldürür


4
sudo apt-get install psmisc (or sudo yum install psmisc)
sudo fuser 80/tcp

Sonuç: 80 / tcp: 1858 1867 1868 1869 1871

İşlemi tek tek öldür

öldür -9 1858


3

Kullanılabilir bir dizi Linux aracına sahip bir Yocto Linux sistemi üzerinde çalışıyorum. Belirli bir limanı kullanan süreci öldürmek istedim (1883).

İlk olarak, hangi portları dinlediğimizi görmek için aşağıdaki komutu kullandım:

root@root:~# netstat -lt
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       
tcp        0      0 0.0.0.0:hostmon         0.0.0.0:*               LISTEN      
tcp        0      0 localhost.localdomain:domain 0.0.0.0:*               LISTEN      
tcp        0      0 0.0.0.0:9080            0.0.0.0:*               LISTEN      
tcp        0      0 0.0.0.0:1883            0.0.0.0:*               LISTEN      
tcp        0      0 :::hostmon              :::*                    LISTEN      
tcp        0      0 localhost:domain        :::*                    LISTEN      
tcp        0      0 :::ssh                  :::*                    LISTEN      
tcp        0      0 :::1883                 :::*                    LISTEN      

Sonra, 1883 numaralı bağlantı noktasını kullanarak işlemin adını şu şekilde buldum:

root@root:~# fuser 1883/tcp
290 
root@root:~# ps | grep 290
  290 mosquitt 25508 S    /usr/sbin/mosquitto -c /etc/mosquitto/mosquitto.conf
12141 root      8444 S    grep 290

Yukarıda görebildiğimiz gibi, bu program /usr/sbin/mosquitto 1883 numaralı bağlantı noktasını kullanan .

Son olarak, süreci öldürdüm:

root@root:~# systemctl stop mosquitto

Kullandığım systemctlbu durumda bir systemd hizmet becuase.


2

Benim durumumda cent os, önerilen cevapta bazı sorunlar var. Bu yüzden aşağıdaki çözümü kullandım:

  ss -tanp | grep 65432 | head -1 | grep -Po "(?<=pid=).*(?=,)" | xargs kill

1

ne veer7 üzerine inşa etmek :

limanda ne olduğunu bilmek istiyorsanız, öldürmeden önce bunu yapın.

$ sudo netstat -plten |grep java
tcp6       0      0 127.0.0.1:8005          :::*                    LISTEN      1000       906726      25296/java      
tcp6       0      0 :::8009                 :::*                    LISTEN      1000       907503      25296/java      
tcp6       0      0 :::8080                 :::*                    LISTEN      1000       907499      25296/java      
$ ps 25296
  PID TTY      STAT   TIME COMMAND
25296 ?        Sl     0:16 /usr/lib/jvm/java-8-openjdk-amd64/bin/java -Dcatalina.base=/hom

'Ps' ve netstat'ın geri bildirdiği işlem sayısını kullanın


1

Git Bash ile başka bir yol:

stopProcessByPortNumber() {
port=":${1}"
portStrLine="$(netstat -ano | findstr LISTENING | findstr $port)"
processId="$(grep -oP '(\d+)(?!.*\d)' <<< $portStrLine)"
echo $processId
taskkill -PID $processId -F
}

1
  1. önce süreci kontrol et netstat -lt
  2. işlem kimliğini kontrol et fuser <port number>/tcp
  3. limanda çalışan süreci öldür kill <process id>

-3

Windows'da olacak netstat -ano | grep "8080"ve aşağıdaki mesajı alıyoruzTCP 0.0.0.0:8080 0.0.0.0:0 LISTENING 10076

PID'yi kullanarak öldürebiliriz taskkill /F /PID 10076


Soru açıkça Linux yardımı istemek; Windows değil.
babycakes
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.