นี่เป็นกระบวนการที่ฉันต้องการฆ่า:
sooorajjj@Treako ~/Desktop/MerkMod $ sudo netstat -tunap | grep :80
tcp6 0 0 :::80 :::* LISTEN 20570/httpd
นี่เป็นกระบวนการที่ฉันต้องการฆ่า:
sooorajjj@Treako ~/Desktop/MerkMod $ sudo netstat -tunap | grep :80
tcp6 0 0 :::80 :::* LISTEN 20570/httpd
คำตอบ:
มีหลายวิธีในการค้นหากระบวนการที่กำลังใช้พอร์ต
การใช้ 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
นี่คือ oneliner ที่แสดงคำสั่งให้เรียกใช้:
echo kill $(sudo netstat -anp | awk '/ LISTEN / {if($4 ~ ":80$") { gsub("/.*","",$7); print $7; exit } }')
แทนที่echo
ด้วยsudo
สำหรับกระบวนการที่จะถูกฆ่าจริง
echo
สำหรับsudo
80
นี่คือคำตอบที่สมบูรณ์แบบเราก็ต้องเปลี่ยนหมายเลขพอร์ตของเราด้วย
สามตัวเลือกสำหรับการแสดงรายการพอร์ตที่เปิดให้บริการใน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
น่าสนใจ
คุณพบแล้วออกซึ่งเป็นกระบวนการที่จะฆ่า: หมายเลขกระบวนการของมัน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
สามารถจัดการได้ในลักษณะนั้น บางคนทำไม่ได้และบางคนไม่มีแม้แต่หน้าคน
มีวิธีง่าย ๆ ในการทำเช่นนี้ ตรวจสอบก่อนว่ากระบวนการใดที่ใช้พอร์ต 80 โดยnetstat :
netstat -ntl | grep 80
ตอนนี้คุณมีชื่อกระบวนการและฆ่ากระบวนการด้วยคำสั่งkillall :
killall -9 process name
killall
โดยไม่มีคำอธิบายหรือคำเตือน
-k
สวิตช์ในการฆ่ากระบวนการที่ตรงกันทั้งหมดและ-i
เพื่อฆ่าแบบโต้ตอบ