การพิจารณาว่ากระบวนการใดถูกผูกไว้กับพอร์ต


90

ฉันรู้ว่าใช้คำสั่ง:

lsof -i TCP 

(หรือตัวแปรบางตัวที่มี lsof) ฉันสามารถพิจารณาว่ากระบวนการใดที่ถูกผูกไว้กับพอร์ตเฉพาะ สิ่งนี้มีประโยชน์บอกถ้าฉันพยายามเริ่มต้นสิ่งที่ต้องการผูกกับ 8080 และบางคนกำลังใช้พอร์ตนั้นอยู่แล้ว แต่ฉันไม่รู้ว่าอะไร

มีวิธีง่าย ๆ โดยไม่ใช้ lsof หรือไม่ ฉันใช้เวลาในการทำงานกับหลาย ๆ ระบบและมักจะไม่ได้ติดตั้ง

คำตอบ:


112

netstat -lnpจะแสดงรายการ pid และชื่อกระบวนการถัดจากพอร์ตการรับฟังแต่ละพอร์ต สิ่งนี้จะทำงานภายใต้ Linux แต่ไม่ใช่ทั้งหมดอื่น ๆ (เช่น AIX) เพิ่ม-tถ้าคุณต้องการ TCP เท่านั้น

# netstat -lntp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp        0      0 0.0.0.0:24800           0.0.0.0:*               LISTEN      27899/synergys
tcp        0      0 0.0.0.0:8000            0.0.0.0:*               LISTEN      3361/python
tcp        0      0 127.0.0.1:3306          0.0.0.0:*               LISTEN      2264/mysqld
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      22964/apache2
tcp        0      0 192.168.99.1:53         0.0.0.0:*               LISTEN      3389/named
tcp        0      0 192.168.88.1:53         0.0.0.0:*               LISTEN      3389/named

เป็นต้น


เจ๋งขอบคุณ ดูเหมือนว่าใช้งานได้ภายใต้ RHEL แต่ไม่ใช่ภายใต้ Solaris (ตามที่คุณระบุ) มีใครรู้บ้างไหมว่ามีบางอย่างที่คล้ายคลึงกับ Solaris

netstat -pด้านบนคือคะแนนของฉัน lsofยังมอง
Rich Homolka

นอกจากนี้สำหรับ windows มันคล้ายกัน: netstat -aon | เพิ่มเติม
Jonathan

แล้ว SCTP ล่ะ?
sudo

12

บน AIX สามารถใช้ netstat & rmsock เพื่อพิจารณากระบวนการเชื่อมโยง:

[root@aix] netstat -Ana|grep LISTEN|grep 80
f100070000280bb0 tcp4       0      0  *.37               *.*        LISTEN
f1000700025de3b0 tcp        0      0  *.80               *.*        LISTEN
f1000700002803b0 tcp4       0      0  *.111              *.*        LISTEN
f1000700021b33b0 tcp4       0      0  127.0.0.1.32780    *.*        LISTEN

# Port 80 maps to f1000700025de3b0 above, so we type:
[root@aix] rmsock f1000700025de3b0 tcpcb
The socket 0x25de008 is being held by process 499790 (java).

1
ขอบคุณสำหรับสิ่งนี้! มีวิธีใดบ้างที่จะแสดงกระบวนการที่ฟังบนซ็อกเก็ต (แทนที่จะใช้ rmsock ที่พยายามจะลบ)
Olivier Dulac

2
@OlivierDulac: "ซึ่งแตกต่างจากชื่อของมันหมายถึง rmsock ไม่ได้ลบซ็อกเก็ตถ้ามันถูกใช้โดยกระบวนการเพียงรายงานกระบวนการถือซ็อกเก็ต" ( ibm.com/developerworks/community/blogs/cgaix/entry/ ...... )
Vitor Py

@ vitor-braga: อ่าขอบคุณ! ฉันคิดว่ามันกำลังพยายามอยู่ แต่เพิ่งบอกว่ากระบวนการใดค้างไว้เมื่อไม่สามารถลบออกได้ เห็นได้ชัดว่ามันไม่ได้พยายามลบออกเมื่อกระบวนการเก็บมันไว้ เยี่ยมมาก! ขอบคุณ!
Olivier Dulac

8

เครื่องมืออื่นที่มีอยู่บนลินุกซ์เอสเอส จากหน้าss ของ man บน Fedora:

NAME
       ss - another utility to investigate sockets
SYNOPSIS
       ss [options] [ FILTER ]
DESCRIPTION
       ss is used to dump socket statistics. It allows showing information 
       similar to netstat. It can display more TCP and state informations  
       than other tools.

ตัวอย่างผลลัพธ์ด้านล่าง - คอลัมน์สุดท้ายแสดงการเชื่อมกระบวนการ:

[root@box] ss -ap
State      Recv-Q Send-Q      Local Address:Port          Peer Address:Port
LISTEN     0      128                    :::http                    :::*        users:(("httpd",20891,4),("httpd",20894,4),("httpd",20895,4),("httpd",20896,4)
LISTEN     0      128             127.0.0.1:munin                    *:*        users:(("munin-node",1278,5))
LISTEN     0      128                    :::ssh                     :::*        users:(("sshd",1175,4))
LISTEN     0      128                     *:ssh                      *:*        users:(("sshd",1175,3))
LISTEN     0      10              127.0.0.1:smtp                     *:*        users:(("sendmail",1199,4))
LISTEN     0      128             127.0.0.1:x11-ssh-offset                  *:*        users:(("sshd",25734,8))
LISTEN     0      128                   ::1:x11-ssh-offset                 :::*        users:(("sshd",25734,7))


2

ครั้งหนึ่งฉันเคยเผชิญหน้ากับการพยายามกำหนดว่ากระบวนการใดที่อยู่เบื้องหลังพอร์ตเฉพาะ (คราวนี้คือ 8000) ฉันลองใช้ lsof และ netstat หลากหลายแบบ แต่จากนั้นก็มีโอกาสและลองกดพอร์ตผ่านเบราว์เซอร์ (เช่นhttp: // hostname: 8000 / ) ดูเถิดและดูเถิดหน้าจอกระเด็นต้อนรับฉันและมันก็เห็นได้ชัดว่ากระบวนการคืออะไร (สำหรับบันทึกมันคือSplunk )

ความคิดอีกอย่างหนึ่ง: "ps -e -o pid, args" (YMMV) บางครั้งอาจแสดงหมายเลขพอร์ตในรายการอาร์กิวเมนต์ Grep คือเพื่อนของคุณ!


ในหลอดเลือดดำเดียวกันคุณสามารถtelnet hostname 8000และดูว่าเซิร์ฟเวอร์พิมพ์แบนเนอร์หรือไม่ อย่างไรก็ตามนั่นเป็นประโยชน์ส่วนใหญ่เมื่อเซิร์ฟเวอร์กำลังทำงานบนเครื่องที่คุณไม่สามารถเข้าถึงเชลล์แล้วค้นหา ID กระบวนการไม่เกี่ยวข้อง
Gilles
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.