กำหนดกระบวนการฟัง pid บนพอร์ตหนึ่ง ๆ


101

ตามชื่อเรื่องฉันใช้เซิร์ฟเวอร์เกมหลายเครื่องและทุกเซิร์ฟเวอร์มีเหมือนกันnameแต่แตกต่างกันPIDและมีportจำนวน ฉันต้องการจับคู่PIDเซิร์ฟเวอร์ที่กำลังฟังอยู่บนพอร์ตบางพอร์ตจากนั้นฉันต้องการที่จะฆ่ากระบวนการนี้ ฉันต้องการสิ่งนั้นเพื่อให้สคริปต์ทุบตีของฉันเสร็จสมบูรณ์

เป็นไปได้หรือไม่? เนื่องจากยังไม่พบวิธีแก้ปัญหาใด ๆ ในเว็บ

คำตอบ:


125

-pธงnetstatช่วยให้คุณ PID ของกระบวนการ:

netstat -l -p

แก้ไข:คำสั่งที่จำเป็นต้องได้รับ PIDs ของผู้ใช้ซ็อกเก็ตใน FreeBSD sockstatคือ ขณะที่เราทำงานในระหว่างการสนทนากับ @Cyclone สายงานที่ทำคือ:

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

2
netstat: 80: unknown or uninstrumented protocolใช้80พอร์ต (nginx) เพื่อทดสอบเจตนา ไม่ทำงาน
พายุไซโคลน

5
ลองnetstat -nlp | grep :80แทน
stanwise

12
netstat: option requires an argument -- p
พายุไซโคลน

2
@jasonbrittain บน Cygwin หน้าต่างพื้นเมืองnetstatเรียกว่า มันมีไวยากรณ์อื่น ๆ
stanwise

2
คำตอบนี้ไม่ถูกต้อง: netstat: option ต้องการอาร์กิวเมนต์ - p
Good Person

143

เวอร์ชันสั้นที่คุณสามารถส่งผ่านไปยังคำสั่ง kill:

lsof -i:80 -t

13
ซึ่งรวมถึงกระบวนการที่เชื่อมต่อบนพอร์ตนั้นด้วย lsof -i4TCP:80 -sTCP:LISTEN -tอาจเป็นสิ่งที่คุณต้องการแทน
Nevir

สิ่งที่ฉันกำลังมองหา ฉันต้องการฆ่ากระบวนการโดยค้นหาพอร์ตที่กำลังทำงานอยู่
mythicalcoder

@Nevir คุณหมายถึงอะไรโดย "รวมถึงกระบวนการที่เชื่อมต่อกับพอร์ตนั้นด้วย" คุณช่วยอธิบายได้ไหม?
kishorer747

2
kill -9 `lsof -i:80 -t`เพื่อความสะดวกในการคัดลอก
bmjrowe

17

netstat -p -l | grep $PORTและlsof -i :$PORT วิธีแก้ปัญหาก็ดี แต่ฉันชอบfuser $PORT/tcpไวยากรณ์ส่วนขยายเป็น POSIX (ซึ่งใช้ได้ผลcoreutils) เช่นเดียวกับท่อ:

pid=`fuser $PORT/tcp`

มันพิมพ์ pid บริสุทธิ์เพื่อให้คุณสามารถทิ้งsedเวทมนตร์ได้

สิ่งหนึ่งที่ทำให้fuserเครื่องมือสำหรับคู่รักของฉันคือความสามารถในการส่งสัญญาณไปยังกระบวนการนั้นโดยตรง (ไวยากรณ์นี้ยังขยายไปยัง POSIX):

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

นอกจากนี้ -k ยังรองรับโดย FreeBSD: http://www.freebsd.org/cgi/man.cgi?query=fuser


1
ฟิวเซอร์เรา
เนียน

10

netstat -nlp ควรบอกให้คุณทราบ PID ว่ากำลังฟังอะไรอยู่ที่พอร์ตใด


1
netstat: 80: unknown or uninstrumented protocolใช้80พอร์ต (nginx) เพื่อทดสอบเจตนา ไม่ทำงาน
พายุไซโคลน

3

เนื่องจาก sockstat ไม่ได้ติดตั้งไว้ในเครื่องของฉันฉันจึงแฮ็กคำตอบของ stanwise ให้ใช้ netstat แทน ..

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

ฉันต้องการเขียนโปรแกรมโดยใช้ Bash เพียงอย่างเดียว - ฆ่ากระบวนการฟังบนพอร์ตที่กำหนด

สมมติว่าพอร์ตคือ 8089 แล้วนี่คือวิธีที่ฉันทำ:

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

ฉันหวังว่านี่จะช่วยคนอื่นได้! ฉันรู้ว่ามันจะช่วยทีมของฉัน


1
นี่คือฟังก์ชั่นที่ฉันใช้ทำ: function kill-listener { lsof -i:$1 -t | xargs kill -9 }ใช้ตัวอย่างพอร์ต 8089 ของคุณ:kill-listener 8089
เฮอริเคนแฮมิลตัน

3

ไวยากรณ์:

ฆ่า -9 $ (lsof -t -i: portnumber)

ตัวอย่าง: หากต้องการฆ่ากระบวนการที่รันที่พอร์ต 4200 ให้รันคำสั่งต่อไปนี้

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

ทดสอบใน Ubuntu


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.