Bagaimana cara membunuh proses yang berjalan pada port tertentu di Linux?

763

Saya mencoba untuk menutup tomcat menggunakan ./shutdown.shdari /bindirektori tomcat . Tetapi menemukan bahwa server tidak ditutup dengan benar. Dan dengan demikian saya tidak dapat me-restart
tomcat saya berjalan di port 8080.

Saya ingin membunuh proses kucing jantan berjalan 8080. Saya pertama-tama ingin memiliki daftar proses yang berjalan pada port tertentu (8080) untuk memilih proses yang akan dimatikan.

veer7
sumber
2
mungkin duplikat skrip shell untuk mematikan proses mendengarkan pada port 3000?
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

Jawaban:

939

Ini fuser 8080/tcpakan mencetak PID Anda dari proses terikat pada port itu.

Dan ini fuser -k 8080/tcpakan membunuh proses itu.

Hanya bekerja di Linux. Lebih universal adalah penggunaan lsof -i4(atau 6 untuk IPv6).

nudzo
sumber
2
apakah ini menutup kemungkinan soket yang terhubung ke 8080 juga?
fer
9
Itu tidak menutup port dengan benar. Port dimasukkan ke dalam status TIME_WAIT setelah proses induknya mati. OS akhirnya akan sepenuhnya menutup port setelah sekitar 60 detik. Ini berarti bahwa Anda tidak dapat menggunakan kembali port untuk setidaknya 60 detik (kecuali Anda memberikan opsi penggunaan kembali ke soket).
Mark Lakata
2
Di Darwin, harus menggunakan versi yang berbeda dari fuser. Hanya mengambil file, tidak mendukung -k.
ap
3
'fuser -k -n tcp 8080' akan membunuh prosesnya juga
Hesham Yassin
7
@dbliss fuser adalah bagian dari psmisc. Jika Anda mendapatkannya fuser: command not found, instal psmisc. Untuk CentOS / RHEL 7, jalankansudo yum install psmisc
Tom
700

Untuk daftar proses mendengarkan port 8080:

lsof -i:8080

Untuk mematikan proses mendengarkan port 8080:

kill $(lsof -t -i:8080)

atau lebih keras:

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

( -9sesuai dengan SIGKILL - terminate immediately/hard killsinyal: lihat Daftar Sinyal Bunuh dan Apa tujuan dari opsi -9 dalam perintah kill?. Jika tidak ada sinyal yang ditentukan kill, sinyal TERM alias -15atau soft killdikirim, yang kadang-kadang tidak cukup untuk membunuh sebuah proses.).

Franck Dernoncourt
sumber
9
kill: penggunaan: kill [-s sigspec | -n signum | -sigspec] pid | jobspec ... or kill -l [sigspec] Inilah yang saya dapatkan ketika saya menjalankan perintah Anda
Sudhir Belagali
2
@SudhirBelagali melakukannya dengan super usersudo
Marcel Djaman
5
Bekerja di Mac saya juga
asherbar
2
Saya ingin menambahkan bahwa kadang-kadang Anda tidak memiliki izin untuk melihat proses id, dalam hal ini yang perlu Anda lakukan sudo lsof -i:8080.
Akavall
1
mengapa tips kedua lebih ganas?
Webwoman
281

Gunakan perintah

 sudo netstat -plten |grep java

digunakan grep javasebagai tomcatkegunaan javasebagai proses mereka.

Ini akan menampilkan daftar proses dengan nomor port dan id proses

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

angka sebelumnya /javaadalah id proses. Sekarang gunakan killperintah untuk mematikan proses

kill -9 16085

-9 menyiratkan proses tersebut akan dibunuh dengan paksa.

veer7
sumber
11
Anda mungkin ingin menambahkan bahwa seseorang mungkin memerlukan hak akses root untuk mendapatkan nama proses melalui netstat.
Jonas Schäfer
2
@JonasWielicki Anda dapat melihat yang Anda miliki tanpa hak akses root.
dbliss
Saya membutuhkan hak akses root untuk netstat. Apakah ada cara untuk benar-benar tahu dari mana proses itu berasal? Sejauh yang saya tahu saya telah menutup semua aplikasi tetapi mungkin dari jendela terminal di mana saya secara tidak sengaja mendorong proses ke tugas latar belakang. Mungkin saya seharusnya menjalankan perintah terminal 'ps' untuk melihat semua proses terlebih dahulu ...
JesseBoyd
150

Saya akan menambahkan ini satu-liner untuk membunuh hanya DENGARKAN pada port tertentu:

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

Gal Bracha
sumber
9
Saya pikir ini harus menjadi jawaban terbaik. Terima kasih @ Gal Bracha
Sam Kah Chiin
2
Ini adalah solusi terbaik karena tidak mematikan browser saya juga!
Russo
Jawaban Terbaik! Sederhana, ringkas, dan melakukan pekerjaan dengan benar.
Tsar Bomba
116

Anda dapat menggunakan perintah lsof. Biarkan nomor port seperti di sini adalah 8090

lsof -i:8090

Perintah ini mengembalikan daftar proses terbuka pada port ini.

Sesuatu seperti…

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

Untuk membebaskan port, matikan proses menggunakannya (id prosesnya adalah 75782) ...

kill -9 75782

Yang ini berhasil untuk saya. di sini adalah tautan dari pos asli: tautan

Kop4lyf
sumber
1
untuk mematikan proses secara paksa, Anda harus menggunakan -9 seperti kill -9 75782; karena terkadang beberapa proses tidak membunuh hanya dengan membunuh
veer7
73

Jika Anda ingin membunuh proses yang berjalan pada nomor port 8080 maka pertama-tama Anda harus menemukan nomor identifikasi proses (PID) port 8080 dan kemudian membunuhnya. Jalankan perintah berikut untuk menemukan P80 nomor port 8080:

sudo lsof -t -i:8080

Sini,

  • sudo - perintah untuk meminta hak istimewa admin (id dan kata sandi pengguna).
  • lsof - daftar file (Juga digunakan untuk daftar proses terkait)
  • -t - hanya menampilkan ID proses
  • -i - hanya menunjukkan proses terkait koneksi internet
  • : 8080 - hanya tampilkan proses dalam nomor port ini

Jadi sekarang Anda dapat dengan mudah membunuh PID Anda menggunakan perintah berikut:

sudo kill -9 <PID>

Sini,

  • kill - command untuk menghentikan proses
  • -9 - dengan paksa

Anda dapat menggunakan satu perintah untuk mematikan proses pada port tertentu menggunakan perintah berikut:

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

Untuk lebih lanjut Anda dapat melihat tautan berikut Cara membunuh proses pada port tertentu di linux

Mahfuz
sumber
terima kasih sobat. sudo kill -9 $(sudo lsof -t -i:8080)bekerja untuk saya
Junaid
69

Cara terbaik untuk membunuh semua proses pada port tertentu;

kill -9 $(sudo lsof -t -i:8080)
Berkay Kırmızıoğlu
sumber
1
Bekerja! Terima kasih.
Fred
Berhasil !, Terima kasih.
Jaylers
Solusi luar biasa sederhana menggunakan subkulit. Terima kasih!
Jason R Stevens CFA
tidak sudo meminta kata sandi
Kuldeep Yadav
41

Ini mencetak untuk menghentikan proses id dari semua yang berjalan pada <port_number>:

fuser -n tcp <port_number> 

Ini juga mencetak beberapa hal ke stderr, jadi:

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

Kami kemudian dapat menyediakan id proses ini ke killperintah:

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

Anda juga bisa meletakkan ini dalam suatu fungsi jika Anda sering melakukannya:

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

Dapatkan PID dari tugas dan bunuh.

lsof -ti:8080 | xargs kill
Rahul Garg
sumber
Terima kasih atas jawabannya. Sangat lancar bekerja di Mac OS. Kamu yang terbaik. Just Up Vote.
AMIC MING
1
Bekerja dengan baik dengan rentang port, juga lsof -ti:8080-8089 | xargs kill.
dvlsg
34

Untuk mengetahui pid layanan yang berjalan di port tertentu:

netstat -tulnap | grep :*port_num*

Anda akan mendapatkan deskripsi proses itu. Sekarang gunakan kill atau kill -9 pid. Mudah dibunuh.

misalnya

netstat -ap | grep :8080

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

Sekarang:

kill -9 1880

Ingatlah untuk menjalankan semua perintah sebagai root

Sanjay s.
sumber
30

Satu liner

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

penjelasan di sini: gunakan kombinasi 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)

pilih pid dan gunakan kill

kill 23672
dlmeetei
sumber
22

coba seperti ini,

 sudo fuser -n tcp -k 8080
Adil Abbasi
sumber
16

Pilih nomor port dan terapkan perintah grep di netstat seperti yang ditunjukkan di bawah ini

netstat -ap | grep :7070

Output Konsol

tcp 0 0 ::: 7070 ::: * DENGARKAN 3332 / java

Matikan layanan berdasarkan PID (Nomor Identifikasi Proses)

kill -9 3332
Lova Chittumuri
sumber
13
  1. lsof -i tcp:8000 Perintah ini mencantumkan informasi tentang proses yang berjalan di port 8000

  2. kill -9 [PID] Perintah ini membunuh prosesnya

Nandhitha Ramaraj
sumber
Saya baru saja memperhatikan bahwa saya membatalkan ini secara tidak sengaja beberapa minggu yang lalu, jika Anda mengedit sedikit jawaban Anda, saya seharusnya dapat menghapusnya
Robin-Hoodie
12

Linux : Pertama, Anda dapat menemukan PID dari perintah ini jika Anda tahu portnya:

netstat -tulpn 

contoh:-

 Local Address  Foreign Address  State    PID/Program name

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

Anda kemudian mengambil proses pembunuhan. jalankan perintah berikut:

bunuh -9 PID

Contoh: -

bunuh -9 15986

Kundan Kumar
sumber
10

Linux : Anda dapat menggunakan perintah ini jika Anda tahu port:

netstat -plten | grep LISTEN | grep 8080

AIX :

netstat -Aan | grep LISTEN | grep 8080

Anda kemudian mengambil kolom pertama (contoh: f100050000b05bb8) dan menjalankan perintah berikut:

rmsock f100050000b05bb8 tcpcb

proses membunuh.

ben rhouma moez
sumber
10

Anda dapat mengetahui daftar semua port yang berjalan dalam sistem beserta perinciannya (pid, alamat, dll.):

netstat -tulpn

Anda dapat mengetahui detail nomor port tertentu dengan memberikan nomor port dalam perintah berikut:

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

mis: sudo netstat -lutnp | grep -w '8080' Detail akan diberikan seperti ini:

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

jika Anda ingin mematikan proses menggunakan pid maka :kill -9 {PID}

jika Anda ingin mematikan proses menggunakan nomor port :fuser -n tcp {port_number}

gunakan sudojika Anda tidak dapat mengaksesnya.

MENYALAK
sumber
6

kill -9 `fuser 8080/tcp|xargs -n 1`, perintah ini juga membunuh proses yang mendengarkan pada port 8080 dengan koneksi TCP

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

Hasil: 80 / tcp: 1858 1867 1868 1869 1871

Bunuh proses satu per satu

bunuh -9 1858

Fadid
sumber
3

Saya sedang mengerjakan sistem Yocto Linux yang memiliki seperangkat alat Linux yang tersedia. Saya ingin membunuh proses yang menggunakan port tertentu (1883).

Pertama, untuk melihat port apa yang kita dengarkan saya menggunakan perintah berikut:

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      

Selanjutnya, saya menemukan nama proses menggunakan port 1883 dengan cara berikut:

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

Seperti yang bisa kita lihat di atas, itu adalah program /usr/sbin/mosquittoyang menggunakan port 1883.

Terakhir, saya membunuh proses:

root@root:~# systemctl stop mosquitto

Saya menggunakan systemctlkarena dalam hal ini ini adalah layanan systemd.

Daniel Jonsson
sumber
2

Dalam kasus saya cent os memiliki beberapa masalah dalam jawaban yang disarankan. Jadi saya menggunakan solusi berikut:

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

untuk membangun apa yang dikatakan @ veer7 :

jika Anda ingin tahu apa yang ada di pelabuhan, lakukan ini sebelum Anda membunuhnya.

$ 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

Gunakan 'ps' dan jumlah proses yang dilaporkan netstat kembali

JesseBoyd
sumber
1

Cara lain dengan Git Bash:

stopProcessByPortNumber() {
port=":${1}"
portStrLine="$(netstat -ano | findstr LISTENING | findstr $port)"
processId="$(grep -oP '(\d+)(?!.*\d)' <<< $portStrLine)"
echo $processId
taskkill -PID $processId -F
}
Lucas Moyano Angelini
sumber
1
  1. periksa dulu prosesnya netstat -lt
  2. periksa id proses fuser <port number>/tcp
  3. matikan proses yang berjalan di port kill <process id>
Gunjan Paul
sumber
-3

Di Windows, itu akan terjadi netstat -ano | grep "8080"dan kami mendapatkan pesan berikutTCP 0.0.0.0:8080 0.0.0.0:0 LISTENING 10076

KAMI dapat membunuh PID menggunakan taskkill /F /PID 10076

Chaklader
sumber
Pertanyaannya jelas meminta bantuan Linux; bukan Windows.
babycakes