2012-03-24 21 views
64

Khi tiêu đề cho biết, tôi đang chạy nhiều máy chủ trò chơi và mỗi máy chủ có cùng một số name nhưng khác nhau PID và số port. Tôi muốn khớp với PID của máy chủ đang nghe trên một số cổng nhất định và sau đó tôi muốn giết quá trình này. Tôi cần điều đó để hoàn thành kịch bản bash của tôi.Xác định quá trình pid đang nghe trên một cổng nhất định

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

Trả lời

90

Các -p cờ của netstat mang đến cho bạn PID của tiến trình:

netstat -l -p 

Edit: Lệnh đó là cần thiết để có được PID của người sử dụng ổ cắm trong FreeBSD là sockstat. Như chúng ta đã làm việc ra trong cuộc thảo luận với @Cyclone, dòng mà không được công việc là:

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

'netstat: 80: giao thức chưa biết hoặc chưa được sử dụng' đã sử dụng cổng' 80' (nginx) để kiểm tra purpoes. Không làm việc. – Cyclone

+0

Bạn nhận được lỗi này như thế nào? Lệnh chính xác nào đã tạo ra nó? – stanwise

+0

'netstat -l -p 80', khi tôi thực hiện' netstat -l -p' Tôi nhận được hướng dẫn: http://pastebin.com/raw.php?i=q9jeQSBj – Cyclone

7

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

+1

'netstat: 80: protocol' không biết hoặc uninstrumented sử dụng cổng '80' (nginx) để thử nghiệm purpoes. Không làm việc. – Cyclone

106

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

lsof -i:80 -t 
+4

Đ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 -t' có lẽ là thứ bạn muốn, thay vào đó. – Nevir

+0

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

+0

@Nevir ý của bạn là gì "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

8

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

pid=`fuser $PORT/tcp` 

nó in pid tinh khiết để bạn có thể thả sed ma thuật ra ngoài.

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

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

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

1

Kể từ sockstat không natively cài đặt trên máy của tôi, tôi bị hack lên câu trả lời stanwise để sử dụng netstat thay vì ..

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"" 
1

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

Hãy nói rằng cổng là 8089, thì đây là cách tôi đã làm nó:

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

Tôi hy vọng điều này sẽ giúp người khác! Tôi biết nó sẽ giúp đội của tôi.

+0

Đây là chức năng tôi sử dụng để thực hiện: 'chức năng 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' –

0

trên cửa sổ, tùy chọn netstat để có được của pid là -o và -p chọn một bộ lọc giao thức, cựu .: netstat -a -p tcp -o