ฆ่ากระบวนการที่ทำงานบนพอร์ต 80


14

นี่เป็นกระบวนการที่ฉันต้องการฆ่า:

sooorajjj@Treako ~/Desktop/MerkMod $ sudo netstat -tunap | grep :80
tcp6    0   0 :::80   :::*     LISTEN    20570/httpd

คำตอบ:


31

มีหลายวิธีในการค้นหากระบวนการที่กำลังใช้พอร์ต

การใช้ fuser จะทำให้ PID ของหลาย ๆ อินสแตนซ์ที่เกี่ยวข้องกับพอร์ตฟัง

sudo apt-get install psmisc
sudo fuser 80/tcp

80/tcp:               1858  1867  1868  1869  1871

หลังจากค้นพบคุณสามารถหยุดหรือฆ่ากระบวนการ

นอกจากนี้คุณยังสามารถค้นหา PID และรายละเอียดเพิ่มเติมโดยใช้ lsof

sudo lsof -i tcp:80

COMMAND  PID     USER   FD   TYPE DEVICE SIZE/OFF NODE NAME  
nginx   1858     root    6u  IPv4   5043      0t0  TCP ruir.mxxx.com:http (LISTEN)  
nginx   1867 www-data    6u  IPv4   5043      0t0  TCP ruir.mxxx.com:http (LISTEN)  
nginx   1868 www-data    6u  IPv4   5043      0t0  TCP ruir.mxxx.com:http (LISTEN)  
nginx   1869 www-data    6u  IPv4   5043      0t0  TCP ruir.mxxx.com:http (LISTEN)  
nginx   1871 www-data    6u  IPv4   5043      0t0  TCP ruir.mxxx.com:http (LISTEN)  

หากต้องการ จำกัด เฉพาะซ็อกเก็ตที่ฟังพอร์ต 80 (ตรงข้ามกับไคลเอ็นต์ที่เชื่อมต่อกับพอร์ต 80):

sudo lsof -i tcp:80 -s tcp:listen

หากต้องการฆ่าพวกเขาโดยอัตโนมัติ:

sudo lsof -t -i tcp:80 -s tcp:listen | sudo xargs kill

1
ฉันต้องการจะชี้ให้เห็นว่าฟิวเซอร์มี-kสวิตช์ในการฆ่ากระบวนการที่ตรงกันทั้งหมดและ-iเพื่อฆ่าแบบโต้ตอบ
A. Wilcox

7

นี่คือ oneliner ที่แสดงคำสั่งให้เรียกใช้:

echo kill $(sudo netstat -anp | awk '/ LISTEN / {if($4 ~ ":80$") { gsub("/.*","",$7); print $7; exit } }')

แทนที่echoด้วยsudoสำหรับกระบวนการที่จะถูกฆ่าจริง


แทนที่echoสำหรับsudo
EliuX

80นี่คือคำตอบที่สมบูรณ์แบบเราก็ต้องเปลี่ยนหมายเลขพอร์ตของเราด้วย
Youssof H.

4

สามตัวเลือกสำหรับการแสดงรายการพอร์ตที่เปิดให้บริการในjsh 's whatisonport:

netstat -anp --numeric-ports | grep ":${PORT}\>.*:" 

fuser -v "${PORT}"/tcp

lsof -P -S 2 -i "tcp:${PORT}" | grep "\(:${PORT}->.*:\|:$PORT (LISTEN)$\)"

ฉันชอบnetstatเพราะมันรวดเร็วรัดกุมและสามารถแสดงรายการพอร์ตที่เปิดโดยผู้ใช้รายอื่น (แม้ว่าจะยังต้องการสิทธิ์ผู้ใช้ขั้นสูง / ผู้ใช้ในการแสดงรายการชื่อและ PID ของกระบวนการดังกล่าว)

เอาท์พุท

$ netstat -anp --numeric-ports | grep ":80\>.*:" 
tcp6       0      0 :::80           :::*            LISTEN      1914/apache2    

$ fuser -v "80/tcp"
                     USER        PID ACCESS COMMAND
80/tcp:              root       1914 F.... apache2
                     www-data  12418 F.... apache2
...

$ lsof -P -S 2 -i "tcp:80" | grep "\(:80->.*:\|:80 (LISTEN)$\)"
apache2  1914     root    4u  IPv6   11920      0t0  TCP *:80 (LISTEN)
apache2 12418 www-data    4u  IPv6   11920      0t0  TCP *:80 (LISTEN)
...

การใช้grepสองกรณีคือการจับคู่พอร์ตเฉพาะที่ด้านโลคัลและข้ามการเชื่อมต่อที่เปิดไปยังพอร์ตระยะไกล 80 (ทางเลือกอื่นจะใช้-lกับnetstatหรือlsofใช้-sTCP:LISTENแต่ฉันชอบ greps ด้านบนเพราะพวกเขาจะ ตรวจจับการเชื่อมต่อขาออกจากพอร์ตที่กำหนดซึ่งบางครั้งอาจเป็นที่สนใจ)

ด้วยการที่lsofเราใช้-Pในการแสดง:80แทนที่จะ:httpทำให้ grep เป็นไปได้ -S 2กองกำลังตัวเลือกlsofที่จะเสร็จสมบูรณ์ในเวลาที่เหมาะสม

ฆ่ากระบวนการ

สมมติว่าเราต้องการใช้netstatเราสามารถคว้าหมายเลข PID ดังนี้:

$ netstat -anp --numeric-ports | grep ":80\>.*:" | grep -o "[0-9]*/" | sed 's+/$++'
1914
...

และเรายังสามารถส่ง PID เหล่านั้นไปที่kill:

... | xargs -d '\n' kill -KILL

อย่างไรก็ตามมักจะมีโอกาสเป็นบวกที่ผิดพลาดเมื่อใช้ regexps ดังนั้นฉันขอแนะนำเพียงแค่ดูผลลัพธ์เริ่มต้นnetstatแล้วตัดสินใจด้วยตนเองว่าจะรันหรือไม่:

$ kill -KILL 1914

ดูสิ่งนี้ด้วย

ฉันมีสคริปต์อื่นที่เรียกว่าlistopenportsน่าสนใจ


3

คุณพบแล้วออกซึ่งเป็นกระบวนการที่จะฆ่า: หมายเลขกระบวนการของมัน20570และไบนารีที่มีชื่อตามที่เขียนไว้ที่ท้ายบรรทัดของการส่งออกของที่httpd netstatคุณสามารถฆ่ามันด้วยหมายเลขkill 20570หรือชื่อkillall httpdแต่ฉันไม่แนะนำให้ทำอย่างนั้น

พอร์ตลดกว่า 1024 มีการใช้มาตรฐาน (ปกติ) คุณสามารถมองขึ้นเหล่านั้นและอื่น ๆ less /etc/servicesอีกมากมายด้วย รายการสำหรับพอร์ต 80 ถูกใส่ความเห็น:

http            80/tcp          www             # WorldWideWeb HTTP

ดังนั้นจึงน่าจะเป็นเว็บเซิร์ฟเวอร์ ชื่อที่คุณมีคือhttpdและman httpdควรให้คำใบ้ที่มีขนาดใหญ่ว่าเป็นไบนารีของ Apache ที่เหมาะกับคุณ Apache เป็นหนึ่งในผู้เล่นรายใหญ่ แต่ก็มีโปรแกรมการจัดการที่สะดวกสบาย แต่คุณไม่จำเป็นต้องใช้มันสำหรับการเริ่ม / หยุด

คุณมีมิ้นต์? ด้วยเดสก์ท็อปปกติ? แล้วมองไปในControl Centerภายใต้และคลิกSystem Servicesคุณต้องเป็นผู้ดูแลระบบเพื่อทำอะไรที่นั่น เลื่อนลงจนกว่าคุณจะพบสิ่งที่มีป้ายกำกับ "เว็บเซิร์ฟเวอร์" (ฉันมี lighttpd แทน Apache และไม่ทราบว่ารายการ Apache จะมีลักษณะอย่างไร) และยกเลิกการเลือก

หากคุณต้องการหยุดมันชั่วคราวลองในคอนโซล

sudo service stop httpd

sudo service start httpdและเริ่มต้นด้วย service --status-allส่งคืนรายการบริการทั้งหมดที่serviceรู้และสามารถจัดการได้ ทางลัดสำหรับการเริ่มต้นใหม่ของการบริการ (นั่นคือหยุดและเริ่มต้นในลำดับที่) เป็นservice --full-restart SERVICEกับSERVICEเป็นชื่อของบริการเช่น .: httpdในกรณีของอาปาเช่

โปรแกรมส่วนใหญ่ที่คุณพบnetstatสามารถจัดการได้ในลักษณะนั้น บางคนทำไม่ได้และบางคนไม่มีแม้แต่หน้าคน


0

มีวิธีง่าย ๆ ในการทำเช่นนี้ ตรวจสอบก่อนว่ากระบวนการใดที่ใช้พอร์ต 80 โดยnetstat :

netstat -ntl | grep 80

ตอนนี้คุณมีชื่อกระบวนการและฆ่ากระบวนการด้วยคำสั่งkillall :

killall -9 process name

อะไรคืออันตรายของการใช้คำสั่ง 'killall'?
Peter Mortensen

2
-1 สำหรับkillallโดยไม่มีคำอธิบายหรือคำเตือน
guntbert

1
มีปัญหาหลายอย่างเกี่ยวกับ killall นอกเหนือจากความสามารถในการนำระบบเข้ามาใช้ในกรณีที่เกิดปัญหาก็สามารถฆ่าหลาย ๆ อินสแตนซ์ของกระบวนการที่ไม่เกี่ยวข้องกับพอร์ต ปัญหาที่ใหญ่ที่สุดของ killall คือถ้าใครบางคนในกล่อง Solaris พยายามที่จะใช้มันจะฆ่ากระบวนการที่กำลังทำงานอยู่ทั้งหมด
Rui F Ribeiro
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.