Tìm (và giết) quá trình khóa cổng 3000 trên máy Mac


1810

Làm cách nào để tìm (và giết) các quá trình nghe / sử dụng các cổng tcp của tôi? Tôi đang trên mac os x.

Đôi khi, sau một sự cố hoặc một số lỗi, ứng dụng rails của tôi đang khóa cổng 3000. Tôi không thể tìm thấy nó bằng cách sử dụng ...

Khi làm

rails server

tôi có

Địa chỉ đã được sử dụng - liên kết (2) (Errno :: EADDRINUSE)

Cập nhật 2014:

Để hoàn thành một số câu trả lời dưới đây: Sau khi thực hiện các lệnh kill, việc xóa tệp pid có thể là cần thiết rm ~/mypath/myrailsapp/tmp/pids/server.pid


25
Một giải pháp rất gọn gàng để tiêu diệt một quá trình trên BẤT K port cổng nào do người dùng chỉ định có thể được tìm thấy trong câu trả lời của @Kevin Scos dưới đây. Được sao chép ở đây cho hậu thế:function killport() { lsof -i TCP:$1 | grep LISTEN | awk '{print $2}' | xargs kill -9 }
user456584

4
Cổng 3000 không phải là 'đặc thù phát triển đường ray' - Sao băng cũng chạy trên 3000 và tôi chắc chắn có những người khác.
gregorvand 7/12/2015

Nhận xét của @ user456584 ở trên phải là câu trả lời được chấp nhận ^^ ​​^ Chức năng đó hoạt động để tiêu diệt nhiều quá trình tôi đã chạy trên một cổng
Aneuway

Câu trả lời:


3026
  1. Bạn co thể thử netstat

    netstat -vanp tcp | grep 3000
    
  2. Đối với macOS El Capitan và mới hơn (hoặc nếu netstat của bạn không hỗ trợ -p), hãy sử dụnglsof

    sudo lsof -i tcp:3000 
    
  3. Đối với Centos 7 sử dụng

    netstat -vanp --tcp | grep 3000
    

22
Cảm ơn bạn! Câu trả lời của bạn đã sinh ra kịch bản "death_to 'port'" của tôi. (#! / Usr / bin / ruby lsof -t -i tcp:#{ARGV.first} | xargs kill)
Sv1

191
Cờ "terse" cho lsof tạo ra đầu ra phù hợp cho đường ống tới lần giết tiếp theo:lsof -t -i tcp:1234 | xargs kill
Manav

6
Tôi đã đặt cái này vào trong ~/.bash_profile: findandkill() { port=$(lsof -n -i4TCP:$1 | grep LISTEN | awk '{ print $2 }') kill -9 $port } alias killport=findandkillVì vậy, bây giờ tôi chỉ cần gõ killport 8080và nó giúp tôi tiết kiệm được vài giây
Alfonso Pérez

3
Một mẹo khác: Hãy chắc chắn thử sudotrước lsof nếu bạn không thấy bất kỳ đầu ra nào
Abe Petrillo

4
Một mẹo khác là thêm -Pvào lsoflệnh để cổng thô có thể nhìn thấy trong đầu ra:lsof -P -i:3000
Jason Axelson

1875

Tìm thấy:

sudo lsof -i :3000

Giết chết:

kill -9 <PID>

61
Đôi khi lsof -i: port sẽ không hiển thị gì. thử sudo lsof -i: cổng .
kilik52

31
Đề nghị thử kill -15 <PID>trước khi dùng đến -9sự an toàn.
Jamon Holmgren

7
@Jamon Holmgren tại sao? cả hai làm gì và tại sao kill <PID>không đủ / nguy hiểm / không đầy đủ?
Michael Trouw

13
@MichaelTrouw gần một năm sau, nhưng đây là câu trả lời của bạn. :-) unix.stackexchange.com/a/8918 TL; DR kill -15cung cấp cho quá trình một cơ hội để làm sạch sau đó.
Jamon Holmgren

9
Tôi nghĩ câu trả lời này nên nói gì -9.
Joseph Fraley

206

Không có gì ở trên làm việc cho tôi. Bất cứ ai khác có kinh nghiệm của tôi đều có thể thử những điều sau (làm việc cho tôi):

Chạy:

lsof -i :3000 (where 3000 is your current port in use)

sau đó kiểm tra trạng thái của PID được báo cáo:

ps ax | grep <PID>

cuối cùng, "bắt đầu với nó":

kill -QUIT <PID>

18
Đây thực sự có vẻ là một câu trả lời tốt hơn câu trả lời sau đó của Filip Spiridonov, người có 277 lần nâng cấp so với 9. Bạn đã sớm hơn 6 tháng và có cùng thông tin với một chút giải thích. Không có công lý ...
Floris

Hãy thử kill -TERM(hoặc chỉ kill) trước kill -QUIT. Không phải mọi quy trình sẽ thực hiện tắt máy có trật tự trên SIGQUIT.
craig65535

160

Một lớp lót để trích xuất PID của quá trình sử dụng cổng 3000 và tiêu diệt nó.

lsof -ti:3000 | xargs kill

Cờ -t loại bỏ mọi thứ trừ PID khỏi đầu ra lsof, giúp dễ dàng tiêu diệt nó.


13
Bạn có thể lọc các cổng "nghe" bằng:lsof -ti:3000 -sTCP:LISTEN
Zlemini

1
Phương pháp này hoạt động tốt nhất cho tôi. Đơn giản một lót mà xóa cổng bận rộn. Cảm ơn!
Ryan Trainor

139

Giải pháp dễ nhất :

Đối với cổng đơn:

kill $(lsof -ti:3000)  #3000 is the port to be freed

Giết nhiều cổng bằng lệnh một dòng:

kill $(lsof -ti:3000,3001)  #here multiple ports 3000 and 3001 are the ports to be freed

lsof -ti: 3000

82500 (ID quy trình / PID)

lsof -ti: 3001

82499

lsof -ti: 3001,3000

82499 82500

giết $ (lsof -ti: 3001,3000)

Chấm dứt cả 82499 và 82500 quy trình trong một lệnh duy nhất.

Để sử dụng điều này trong package.jsoncác tập lệnh:

"scripts": { "start": "kill $(lsof -ti:3000,3001) && npm start" }


2
Điều này làm việc cho tôi Cảm ơn :)
HÃY THỬ THÁNG 12/12/19

2
Vui vì nó đã giúp.
Abhijith Sasikumar

113

Dòng lệnh đơn này rất dễ nhớ:

npx kill-port 3000

Đối với một công cụ mạnh mẽ hơn với tìm kiếm:

npx fkill-cli


PS: Họ sử dụng các gói javascript của bên thứ ba. npxđược tích hợp sẵn với Node.js.

Nguồn: tweet | github


Bạn có thể chia sẻ chi tiết về việc cài đặt npx bằng brew không? Tôi đã thử cài đặt nó trên Mac High Sierra, 10.13.3 và nó không hoạt động.
realPK

@realPK npxđi kèm với npmnode.js, vì vậy nó không phải là một gói riêng biệt. Chỉ cần nâng cấp node.js và các phiên bản npm của bạn.
Bruno Lemos

Tôi làm Java hầu hết, chưa tiếp xúc với Node. Tôi tìm thấy một cách khác để giết dịch vụ chạy trên cảng. TY để trả lời.
realPK

5
Sự cần thiết của NodeJS và JavaScript, để tiêu diệt thứ gì đó đang chạy trên cổng 3000 có lẽ là đường ray ... có vẻ như quá nhiều chi phí đối với tôi. thêm một dòng đơn giản vào .bashrc hoặc .zshrc của bạn bằng một bí danh sẽ giải quyết nó mà không cần internet. bí danh kill3000 = 'lsof -ti: 3000 | xargs kill 'thì bạn có thể làm: kill3000
Khalil Gharbaoui

Giải pháp tốt nhất cho vấn đề này .. cảm ơn
Vua Rayhan

107

Bạn có thể sử dụng lsof -i:3000.

Đó là "Liệt kê các tệp đang mở". Điều này cung cấp cho bạn một danh sách các quy trình và các tập tin và cổng mà họ sử dụng.


Tôi đang ở trên 10,5 lepard (cập nhật Q). Tôi không biết điều đó có quan trọng ở đây không, nhưng lsof không hiển thị các cổng. lsof -h (lsof 4.78) quá khó hiểu quá ...
oma

1
Hừm. Tôi không biết chắc chắn về Leopard, nhưng hãy thử ( với quyền root - điều đó quan trọng, tôi nghĩ vậy) lsof -i:3000.
Matt Gibson

59

Trong của bạn .bash_profile, tạo một lối tắt cho terminatequy trình 3000:

terminate(){
  lsof -P | grep ':3000' | awk '{print $2}' | xargs kill -9 
}

Sau đó, gọi $terminatenếu nó bị chặn.


12
Bạn có thể làm cho điều này đủ linh hoạt cho bất kỳ cổng nào: github.com/kevinSript/dotfiles/commit/ mẹo
Kevin Scos

Và một tên mô tả như vậy = p
Michael Peterson

Tôi có một cái gì đó tương tự như thế này nhưng tôi vượt qua trong cảng. Tôi đặt tên cho hàm KP của tôi cho cổng kill.
Joseph Chambers

58

Để mạnh mẽ giết chết một quá trình như vậy, sử dụng lệnh sau

lsof -n -i4TCP:3000 

Trong đó 3000 là số cổng mà quá trình đang chạy

cái này trả về id quá trình (PID) và chạy

kill -9 "PID"

Thay thế PID bằng số bạn nhận được sau khi chạy lệnh đầu tiên

Đối với Instance, nếu tôi muốn hủy tiến trình đang chạy trên cổng 8080


38
lsof -P | grep ':3000' | awk '{print $2}'

Điều này sẽ cung cấp cho bạn chỉ là pid, được thử nghiệm trên MacOS.


10
trên MAC tiêu diệt tất cả các pids trên cổng 3000: lsof -P | grep ': 3000' | awk '{in $ 2}' | xargs kill -9
mike clagg

1
có thể nhiều hơn một quá trình nghe cùng một cổng?
Kris

Ứng dụng rails của chúng tôi sinh ra các công nhân là các quy trình trẻ em và tôi phải sử dụng điều này để giết các công nhân mồ côi
mike clagg

2
điều này cũng giết chết các webbrows kết nối với cổng
fjsj

5
Đây là một công việc:lsof -n -iTCP:3407 -sTCP:LISTEN -n -l -P | grep 'LISTEN' | awk '{print $2}' | xargs kill -9
bob

29

Thực thi trong dòng lệnh trên OS-X El Captain:

kill -kill `lsof -t -i tcp:3000`

Tùy chọn Terse của lsof chỉ trả về PID.


28

Một trong những cách để giết một tiến trình trên một cổng là sử dụng thư viện python: freeport ( https://pypi.python.org/pypi/freeport/0.1.9 ). Sau khi cài đặt, chỉ cần:

# install freeport
pip install freeport

# Once freeport is installed, use it as follows
$ freeport 3000
Port 3000 is free. Process 16130 killed successfully

7
Đó là, cách đơn giản nhất. Các câu trả lời được nâng cấp không yêu cầu bạn tải xuống và cài đặt bất cứ thứ gì.
Greg Pasquariello

4
Khi các điều kiện tiên quyết được đáp ứng, điều này rất đơn giản và dễ nhớ. Chúng tôi có một định nghĩa khác về "đơn giản nhất" và câu trả lời này là hoàn toàn hợp lệ và phù hợp. Có lẽ nó chỉ thiếu các hướng dẫn để cài đặt freeport với pip.
Cyril Duchon-Doris

dưới mui xe, freeport chỉ là một trình bao bọc gọi lsof -t -i:3000.. có vẻ không cần thiết.
Corey Goldberg

Giải pháp này không phải là dễ nhất, nhưng nó tuân thủ 100% với những gì OP yêu cầu ... Vì vậy, đây là hành động hợp lệ AF
danielrvt

26

Để xem các quá trình chặn cổng:

netstat -vanp tcp | grep 3000

Để tiêu diệt các tiến trình chặn cổng:

kill $(lsof -t -i :3000)


Điều này sẽ không hoạt động trên máy Mac, trả về như sau: kill: usage: kill [-s sigspec | -n signum | -sigspec] pid | jobspec ... or kill -l [sigspec]Tuy nhiên, nó sẽ hoạt động trong hầu hết các bản phân phối linux
Milan Velebit

1
@MilanVelebit Trên thực tế, nó hoạt động hoàn hảo trong máy Mac của tôi (Sierra). Nó hoạt động tốt nếu cổng của bạn 3000bị chiếm đóng. Tuy nhiên nếu không có tiến trình nào chặn cổng thì bạn sẽ gặp kill: not enough argumentslỗi.
Henry

Điều đó thật kỳ lạ, tôi có hai máy Mac (cả High Sierra tho), tôi nhớ chạy các lệnh đó trên cả hai (thói quen cũ) và tôi biết chắc chắn rằng chúng không chạy. Tôi vừa thử lại trên máy, biết rằng cổng bị chiếm, lỗi tương tự. : /
Milan Velebit

Bạn đã có được một PID hợp lệ khi chạy chưa netstat -vanp tcp | grep 3000, cho cổng của bạn đã bị chiếm đóng?
Henry

1
Tôi đã thử nó trong cả hai bashzshvỏ. Hoạt động tốt cho tôi. Không chắc chắn tại sao nó không làm việc cho bạn. Có thể là một số điều với High Sierra? Tôi không biết: /
Henry

24

Tìm kết nối mở

lsof -i -P | grep -i "lắng nghe"

Giết bởi ID tiến trình

giết -9 'PID'


20

Tìm và giết:

Dòng lệnh đơn này là dễ dàng và hoạt động chính xác.

kill -9 $(lsof -ti tcp:3000)

14

Những cách có thể để đạt được điều này:

hàng đầu

Lệnh trên cùng là cách truyền thống để xem việc sử dụng tài nguyên hệ thống của bạn và xem các quy trình đang chiếm nhiều tài nguyên hệ thống nhất. Top hiển thị danh sách các quy trình, với các quy trình sử dụng nhiều CPU nhất ở trên cùng.

ps

Lệnh ps liệt kê các tiến trình đang chạy. Lệnh sau liệt kê tất cả các quy trình đang chạy trên hệ thống của bạn:

ps -A

Bạn cũng có thể dẫn đầu ra thông qua grep để tìm kiếm một quy trình cụ thể mà không cần sử dụng bất kỳ lệnh nào khác. Lệnh sau sẽ tìm kiếm quy trình Firefox:

ps -A | grep firefox

Cách phổ biến nhất để truyền tín hiệu đến một chương trình là với lệnh kill.

kill PID_of_target_process

lsof

Danh sách tất cả các tệp đang mở và các quy trình đã mở chúng.

lsof -i -P | grep -i "listen"
kill -9 PID

hoặc là

 lsof -i tcp:3000 

10

lsof -i tcp:port_number - sẽ liệt kê quá trình đang chạy trên cổng đó

kill -9 PID - sẽ giết quá trình

trong trường hợp của bạn, nó sẽ là

lsof -i tcp:3000 từ thiết bị đầu cuối của bạn tìm thấy PID của quá trình

kill -9 PID


10

Hai lệnh này sẽ giúp bạn tìm và giết tiến trình máy chủ

  1. lsof -wni tcp: 3000
  2. giết -9 pid

Niềm vui của tôi, Aashiah
Saif chaudhry

5

Thêm vào ~/.bash_profile:

function killTcpListen () {
  kill -QUIT $(sudo lsof -sTCP:LISTEN -i tcp:$1 -t)
}

Sau đó source ~/.bash_profilevà chạy

killTcpListen 8080



4

TL; DR:

lsof -ti tcp:3000 -sTCP:LISTEN | xargs kill

Nếu bạn đang ở trong tình huống có cả máy khách và máy chủ sử dụng cổng, ví dụ:

$ lsof -i tcp:3000
COMMAND     PID         USER   FD   TYPE             DEVICE SIZE/OFF NODE NAME
node       2043 benjiegillam   21u  IPv4 0xb1b4330c68e5ad61      0t0  TCP localhost:3000->localhost:52557 (ESTABLISHED)
node       2043 benjiegillam   22u  IPv4 0xb1b4330c8d393021      0t0  TCP localhost:3000->localhost:52344 (ESTABLISHED)
node       2043 benjiegillam   25u  IPv4 0xb1b4330c8eaf16c1      0t0  TCP localhost:3000 (LISTEN)
Google    99004 benjiegillam  125u  IPv4 0xb1b4330c8bb05021      0t0  TCP localhost:52557->localhost:3000 (ESTABLISHED)
Google    99004 benjiegillam  216u  IPv4 0xb1b4330c8e5ea6c1      0t0  TCP localhost:52344->localhost:3000 (ESTABLISHED)

sau đó bạn có thể không muốn giết cả hai.

Trong tình huống này, bạn có thể sử dụng -sTCP:LISTENđể chỉ hiển thị các quy trình đang lắng nghe. Kết hợp điều này với -tđịnh dạng ngắn gọn, bạn có thể tự động giết quá trình:

lsof -ti tcp:3000 -sTCP:LISTEN | xargs kill

4

Tôi đã thực hiện một chức năng nhỏ cho điều này, thêm nó vào tập tin rc của bạn ( .bashrc, .zshrchoặc bất cứ điều gì)

function kill-by-port {
  if [ "$1" != "" ]
  then
    kill -9 $(lsof -ni tcp:"$1" | awk 'FNR==2{print $2}')
  else
    echo "Missing argument! Usage: kill-by-port $PORT"
  fi
}

sau đó bạn chỉ cần gõ kill-by-port 3000để giết máy chủ rails của mình (thay thế 3000 cho bất kỳ cổng nào nó đang chạy)

không thành công, bạn luôn có thể gõ kill -9 $(cat tmp/pids/server.pid)từ thư mục gốc rails


Tôi đã phải gạch chéo \$PORTlại để thông báo hiển thị chính xác. Nếu không, làm việc tuyệt vời!
tro gỗ

4

Để giết nhiều cổng.

$ npx kill-port 3000 8080 8081

Process on port 3000 killed
Process on port 8080 killed
Process on port 8081 killed

Hy vọng điều này giúp đỡ!


1

Bạn nên thử cái này, Kỹ thuật này là OS độc lập.

Trong ứng dụng của bạn có một thư mục gọi là tmp, bên trong đó có một thư mục khác gọi là pids. Tập tin đó chứa tập tin pid máy chủ. Đơn giản chỉ cần xóa tập tin đó. cổng tự động tự chết.

Tôi nghĩ rằng đây là cách dễ dàng.


1

Đây là một hàm bash của trình trợ giúp để giết nhiều tiến trình theo tên hoặc cổng

fkill() {
  for i in $@;do export q=$i;if [[ $i == :* ]];then lsof -i$i|sed -n '1!p';
  else ps aux|grep -i $i|grep -v grep;fi|awk '{print $2}'|\
  xargs -I@ sh -c 'kill -9 @&&printf "X %s->%s\n" $q @';done
}

Sử dụng:

$ fkill [process name] [process port]

Thí dụ:

$ fkill someapp :8080 node :3333 :9000


0

Nếu bạn muốn một cách miễn phí mã - mở trình quản lý hoạt động và buộc nút kill :)



-1

Bước 1: Tìm máy chủ đang chạy: ps aux | grep puma Bước 2: Tiêu diệt những máy chủ đó Kill -9 [số máy chủ]


-1

Trong hệ điều hành mac

kill -9 $(lsof -i TCP:3000 | grep LISTEN | awk '{print $2}')


1
Điều này đã được đăng dưới dạng một bình luận 5 năm trước và các câu trả lời mô phỏng đã được đăng nhiều lần.
Gilles Gouaillardet
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.