Xác định quá trình nghe pid trên một cổng nhất định


101

Như tiêu đề đã nói, tôi đang chạy nhiều máy chủ trò chơi và mỗi máy chủ đều có cùng số lượng và namenhưng khác nhau . Tôi muốn khớp với máy chủ đang lắng nghe trên một số cổng nhất định và sau đó tôi muốn kết thúc quá trình này. Tôi cần điều đó để hoàn thành tập lệnh bash của mình.PIDportPID

Điều đó thậm chí có thể? Bởi vì nó không tìm thấy bất kỳ giải pháp nào trên web.

Câu trả lời:


125

Các -plá cờ của netstatmang đến cho bạn PID của tiến trình:

netstat -l -p

Chỉnh sửa: Lệnh cần thiết để lấy PID của người dùng socket trong FreeBSD là sockstat. Như chúng tôi đã tìm ra trong cuộc thảo luận với @Cyclone, dòng thực hiện công việc là:

sockstat -4 -l | grep :80 | awk '{print $3}' | head -1

2
netstat: 80: unknown or uninstrumented protocolđã sử dụng 80cổng (nginx) để thử nghiệm. Không hoạt động.
Cơn lốc

5
hãy thử netstat -nlp | grep :80thay thế
stanwise

12
netstat: option requires an argument -- p
Cyclone

2
@jasonbrittain Trên Cygwin, windows native netstatđược gọi. Nó có cú pháp khác.
stanwise

2
câu trả lời này là sai: netstat: Tùy chọn đòi hỏi một cuộc tranh cãi - p
Good Person

143

Phiên bản ngắn mà bạn có thể vượt qua để giết lệnh:

lsof -i:80 -t

13
Điều này cũng bao gồm các quy trình được kết nối trên cổng đó. lsof -i4TCP:80 -sTCP:LISTEN -tcó thể là những gì bạn muốn, thay vào đó.
Nevir

Chính xác những gì tôi đang tìm kiếm. Tôi muốn giết một tiến trình bằng cách tìm kiếm cổng mà nó đang chạy.
mythicalcoder

@Nevir ý của bạn là gì khi "cũng bao gồm các quy trình được kết nối trên cổng đó"? Bạn có thể giải thích dùm không?
kishorer747,

2
kill -9 `lsof -i:80 -t`để dễ sao chép
bmjrowe

17

netstat -p -l | grep $PORTlsof -i :$PORT các giải pháp là tốt nhưng tôi thích fuser $PORT/tcpcú pháp mở rộng hơn POSIX (hoạt động cho coreutils) như với đường ống:

pid=`fuser $PORT/tcp`

nó in pid thuần túy để bạn có thể thả sedphép thuật.

Một điều làm cho fusercông cụ người yêu của tôi là khả năng gửi tín hiệu trực tiếp đến quá trình đó (cú pháp này cũng là phần mở rộng cho POSIX):

$ fuser -k $port/tcp       # with SIGKILL
$ fuser -k -15 $port/tcp   # with SIGTERM
$ fuser -k -TERM $port/tcp # with SIGTERM

Ngoài ra -k được hỗ trợ bởi FreeBSD: http://www.freebsd.org/cgi/man.cgi?query=fuser


1
fuser us gọn gàng hơn và ngắn gọn
Dawoodjee

10

netstat -nlp sẽ cho bạn biết PID của những gì đang nghe trên cổng nào.


1
netstat: 80: unknown or uninstrumented protocolđã sử dụng 80cổng (nginx) để thử nghiệm. Không hoạt động.
Cơn lốc

3

Vì sockstat không được cài đặt nguyên bản trên máy của tôi nên tôi đã hack câu trả lời của stanwise để sử dụng netstat thay thế ..

netstat -nlp | grep -E "[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\:2000" | awk '{print $7}' | sed -e "s/\/.*//g""

3

Tôi muốn lập trình - chỉ sử dụng Bash - giết quá trình lắng nghe trên một cổng nhất định.

Giả sử cổng là 8089, sau đó đây là cách tôi đã làm điều đó:

badPid=$(netstat --listening --program --numeric --tcp | grep "::8089" | awk '{print $7}' | awk -F/ '{print $1}' | head -1)
kill -9 $badPid

Tôi mong điều này giúp được người nào khác! Tôi biết nó sẽ giúp ích cho nhóm của tôi.


1
Đây là chức năng tôi sử dụng để thực hiện việc đó: function kill-listener { lsof -i:$1 -t | xargs kill -9 }Sử dụng ví dụ của bạn về cổng 8089:kill-listener 8089
Bão Hamilton

3

Cú pháp:

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

Ví dụ: Để hủy tiến trình đang chạy ở cổng 4200, hãy chạy lệnh sau

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

Đã thử nghiệm trong Ubuntu.


2

trên windows, tùy chọn netstat để lấy pid là -o và -p chọn bộ lọc giao thức, ví dụ: netstat -a -p tcp -o

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.