Làm thế nào để giết một tiến trình đang chạy trên một cổng cụ thể trong Linux?


762

Tôi đã cố gắng để đóng tomcat bằng cách sử dụng ./shutdown.shtừ /binthư mục tomcat . Nhưng thấy rằng máy chủ không được đóng đúng cách. Và do đó tôi không thể khởi động lại
Tomcat của tôi đang chạy trên cổng 8080.

Tôi muốn giết quá trình tomcat chạy trên 8080. Trước tiên tôi muốn có danh sách các quy trình đang chạy trên một cổng cụ thể (8080) để chọn quy trình nào cần hủy.


Câu trả lời:


938

Điều này fuser 8080/tcpsẽ in cho bạn PID của quá trình bị ràng buộc trên cổng đó.

Và điều này fuser -k 8080/tcpsẽ giết quá trình đó.

Chỉ hoạt động trên Linux. Phổ quát hơn là sử dụnglsof -i4 (hoặc 6 cho IPv6).


2
cái này có đóng một ổ cắm kết nối có thể với 8080 không?
Fer y

9
Nó không đóng cổng đúng cách. Cổng được đưa vào trạng thái TIME_WAIT sau khi tiến trình cha bị hủy. Hệ điều hành cuối cùng sẽ đóng hoàn toàn cổng sau khoảng 60 giây. Điều đó có nghĩa là bạn không thể sử dụng lại cổng trong ít nhất 60 giây (trừ khi bạn cung cấp tùy chọn sử dụng lại cho ổ cắm).
Đánh dấu Lakata

2
Trên Darwin, phải sử dụng một phiên bản khác fuser. Chỉ mất một tập tin, không hỗ trợ -k.
ap

3
'fuser -k -n tcp 8080' cũng sẽ giết quá trình
Hesham Yassin

7
@dbliss fuser là một phần của psmisc. Trong trường hợp bạn nhận được fuser: command not found, cài đặt psmisc. Đối với CentOS / RHEL 7, hãy chạysudo yum install psmisc
Tom

700

Để liệt kê bất kỳ quá trình nghe cổng 8080:

lsof -i:8080

Để giết bất kỳ quá trình nghe cổng 8080:

kill $(lsof -t -i:8080)

hoặc dữ dội hơn:

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

( -9tương ứng với SIGKILL - terminate immediately/hard killtín hiệu: xem Danh sách tín hiệu tiêu diệtmục đích của tùy chọn -9 trong lệnh kill là gì? Nếu không có tín hiệu nào được chỉ định kill, tín hiệu TERM aka -15hoặc soft killđược gửi, đôi khi không đủ để giết một tiến trình.).


9
kill: cách sử dụng: kill [-s sigspec | -n dấu hiệu | -sigspec] pid | jobspec ... hoặc kill -l [sigspec] Đây là những gì tôi nhận được khi tôi Thực thi mệnh lệnh của bạn
Sudhir Belagali

2
@SudhirBelagali đã làm điều đó với siêu người dùngsudo
Marcel Djaman

5
Làm việc trên máy Mac của tôi cũng vậy
asherbar

2
Tôi muốn thêm rằng đôi khi bạn không có quyền để xem id quá trình, trong trường hợp đó bạn cần phải làm sudo lsof -i:8080.
Akavall

1
Tại sao các mẹo thứ hai là bạo lực hơn?
Nữ web

281

Sử dụng lệnh

 sudo netstat -plten |grep java

sử dụng grep javanhư tomcatsử dụng javanhư quy trình của họ.

Nó sẽ hiển thị danh sách các tiến trình với số cổng và id tiến trình

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

số trước /javalà id quá trình. Bây giờ sử dụng killlệnh để giết quá trình

kill -9 16085

-9 ngụ ý quá trình sẽ bị giết chết mạnh mẽ.


11
Bạn có thể muốn thêm rằng người ta có thể cần các đặc quyền gốc để có được tên quy trình thông qua netstat.
Jonas Schäfer

2
@JonasWielicki bạn có thể thấy những người bạn sở hữu quyền root.
dbliss

Tôi cần quyền root cho netstat. Có cách nào để thực sự biết quá trình này đến từ đâu không? Theo như tôi có thể nói rằng tôi đã đóng tất cả các ứng dụng nhưng nó có thể là từ một cửa sổ đầu cuối nơi tôi vô tình đẩy các quy trình sang một tác vụ nền. Có lẽ tôi nên chạy lệnh đầu cuối 'ps' để xem tất cả các quy trình trước tiên ...
JesseBoyd

150

Tôi sẽ thêm một lớp lót này để chỉ giết LISTEN trên cổng cụ thể:

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


9
Tôi nghĩ rằng đây nên là câu trả lời tốt nhất. Cảm ơn @Gal Bracha
Sam Kah Chiin

2
Đây là giải pháp tốt nhất vì nó cũng không giết trình duyệt của tôi!
Russo

Câu trả lời tốt nhất! Đơn giản, súc tích, và thực hiện công việc một cách chính xác.
Sa hoàng Bomba

116

Bạn có thể sử dụng lệnh lsof. Đặt số cổng như ở đây là 8090

lsof -i:8090

Lệnh này trả về một danh sách các quy trình mở trên cổng này.

Cái gì đó như…

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

Để giải phóng cổng, giết tiến trình bằng cách sử dụng nó (id quá trình là 75782)

kill -9 75782

Cái này làm việc cho tôi đây là liên kết từ bài viết gốc: link


1
để giết quá trình một cách mạnh mẽ, bạn sẽ cần sử dụng -9 như kill -9 75782; vì đôi khi một vài quá trình không giết chỉ bằng cách giết
veer7

73

Nếu bạn muốn giết một tiến trình đang chạy trên số cổng 8080 thì trước tiên bạn cần tìm số nhận dạng quy trình cổng 8080 (PID) và sau đó giết nó. Chạy lệnh sau để tìm số cổng 8080 số PID:

sudo lsof -t -i:8080

Đây,

  • sudo - lệnh để yêu cầu đặc quyền quản trị viên (id người dùng và mật khẩu).
  • lsof - danh sách các tệp (Cũng được sử dụng để liệt kê các quy trình liên quan)
  • -t - chỉ hiển thị ID tiến trình
  • -i - chỉ hiển thị quá trình kết nối internet
  • : 8080 - chỉ hiển thị các quy trình trong số cổng này

Vì vậy, bây giờ bạn có thể dễ dàng tiêu diệt PID của mình bằng lệnh sau:

sudo kill -9 <PID>

Đây,

  • giết - lệnh để giết quá trình
  • -9 - mạnh mẽ

Bạn có thể sử dụng một lệnh để giết một tiến trình trên một cổng cụ thể bằng lệnh sau:

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

Để biết thêm bạn có thể xem liên kết sau Cách giết một quá trình trên một cổng cụ thể trên linux


cảm ơn bạn đời sudo kill -9 $(sudo lsof -t -i:8080)làm việc cho tôi
Junaid

69

Cách tốt nhất để giết tất cả các quy trình trên một cổng cụ thể;

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

1
Đã làm việc! Cảm ơn.
Fred

Nó đã hoạt động!, Cảm ơn bạn.
Jaylers

Giải pháp đơn giản tuyệt vời bằng cách sử dụng một subshell. Cảm ơn!
Jason R Stevens CFA

không nhắc nhở mật khẩu
Kuldeep Yadav

41

Điều này in ra để kiểm tra id quá trình của mọi thứ đang chạy trên <port_number>:

fuser -n tcp <port_number> 

Nó cũng in một số thứ để stderr, vì vậy:

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

Sau đó chúng ta có thể cung cấp các id quá trình này cho killlệnh:

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

Bạn cũng có thể đặt nó trong một hàm nếu bạn làm nó nhiều:

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

35

Nhận PID của nhiệm vụ và giết nó.

lsof -ti:8080 | xargs kill

Cảm ơn câu trả lời. Hoạt động rất trơn tru trong Mac OS. Bạn là nhất. Chỉ cần bình chọn.
AMIC MING

1
Hoạt động tốt với phạm vi cổng, quá, như lsof -ti:8080-8089 | xargs kill.
dvlsg

34

Để biết pid của dịch vụ chạy trên cổng cụ thể:

netstat -tulnap | grep :*port_num*

bạn sẽ nhận được mô tả của quá trình đó. Bây giờ sử dụng kill hoặc kill -9 pid. Dễ dàng bị giết.

ví dụ

netstat -ap | grep :8080

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

Hiện nay:

kill -9 1880

Nhớ chạy tất cả các lệnh như root


30

Lót

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

giải thích ở đây: sử dụng kết hợp 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)

chọn pid và sử dụng kill

kill 23672


16

Chọn số cổng và áp dụng lệnh grep trong lệnh netstat như bên dưới

netstat -ap | grep :7070

Bảng điều khiển đầu ra

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

Tiêu diệt dịch vụ dựa trên PID (Số nhận dạng quy trình)

kill -9 3332

13
  1. lsof -i tcp:8000 Lệnh này liệt kê thông tin về quá trình đang chạy trong cổng 8000

  2. kill -9 [PID] Lệnh này giết chết quá trình


Tôi chỉ nhận thấy rằng tôi đã hạ thấp điều này một cách tình cờ vài tuần trước, nếu bạn chỉnh sửa anwer của mình một chút, tôi sẽ có thể gỡ bỏ nó
Robin-Hoodie

12

Linux : Trước tiên, bạn có thể tìm thấy PID của lệnh này nếu bạn biết cổng:

netstat -tulpn 

thí dụ:-

 Local Address  Foreign Address  State    PID/Program name

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

Sau đó bạn thực hiện quá trình tiêu diệt. chạy lệnh sau:

giết -9 PID

Ví dụ: -

giết -9 15986


10

Linux : Bạn có thể sử dụng lệnh này nếu bạn biết cổng:

netstat -plten | grep LISTEN | grep 8080

AIX :

netstat -Aan | grep LISTEN | grep 8080

Sau đó, bạn lấy cột đầu tiên (ví dụ: f100050000b05bb8) và chạy lệnh sau:

rmsock f100050000b05bb8 tcpcb

quá trình tiêu diệt.


10

Bạn có thể biết danh sách tất cả các cổng đang chạy trong hệ thống cùng với các chi tiết của nó (pid, địa chỉ, v.v.):

netstat -tulpn

Bạn có thể biết chi tiết về một số cổng cụ thể bằng cách cung cấp số cổng theo lệnh sau:

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

ví dụ: sudo netstat -lutnp | grep -w '8080' Chi tiết sẽ được cung cấp như thế này:

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

Nếu bạn muốn giết một tiến trình bằng pid thì :kill -9 {PID}

nếu bạn muốn giết một tiến trình bằng cách sử dụng số cổng :fuser -n tcp {port_number}

sử dụng sudonếu bạn không thể truy cập bất kỳ.


6

kill -9 `fuser 8080/tcp|xargs -n 1`, lệnh này cũng giết quá trình lắng nghe trên cổng 8080 bằng kết nối TCP


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

Kết quả: 80 / tcp: 1858 1867 1868 1869 1871

Giết quá trình từng cái một

giết -9 1858


3

Tôi đang làm việc trên một hệ thống Yocto Linux có một bộ công cụ Linux có sẵn hạn chế. Tôi muốn giết quá trình sử dụng một cổng cụ thể (1883).

Đầu tiên, để xem những cổng nào chúng ta đang nghe tôi đã sử dụng lệnh sau:

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      

Tiếp theo, tôi tìm thấy tên của quá trình sử dụng cổng 1883 theo cách sau:

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

Như chúng ta có thể thấy ở trên, đó là chương trình /usr/sbin/mosquitto sử dụng cổng 1883.

Cuối cùng, tôi đã giết quá trình:

root@root:~# systemctl stop mosquitto

Tôi đã sử dụng systemctlbecuase trong trường hợp này là dịch vụ systemd.


2

Trong trường hợp của tôi cent os có một số vấn đề trong câu trả lời được đề xuất. Vì vậy, tôi đã sử dụng giải pháp sau đây:

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

1

để xây dựng dựa trên những gì @ veer7 đã nói:

nếu bạn muốn biết những gì trên cổng, hãy làm điều này trước khi bạn giết 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

Sử dụng 'ps' và số quy trình mà netstat đã báo cáo lại


1

Cách khác với Git Bash:

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

1
  1. đầu tiên kiểm tra quá trình netstat -lt
  2. kiểm tra quá trình id fuser <port number>/tcp
  3. giết quá trình chạy trên cảng kill <process id>

-3

Trong Windows, nó sẽ được netstat -ano | grep "8080"và chúng tôi nhận được thông báo sauTCP 0.0.0.0:8080 0.0.0.0:0 LISTENING 10076

CHÚNG TÔI có thể tiêu diệt PID bằng cách sử dụng taskkill /F /PID 10076


Câu hỏi rõ ràng là yêu cầu trợ giúp Linux; không phải Windows.
babycakes
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.