ค้นหา PID ของกระบวนการโดยใช้พอร์ตเฉพาะหรือไม่


391

ฉันกำลังติดตั้ง hadoop บนระบบ Ubuntu ของฉัน เมื่อฉันเริ่มมันรายงานว่าพอร์ต 9000 ไม่ว่าง

ฉันใช้:

netstat -nlp|grep 9000

เพื่อดูว่ามีพอร์ตดังกล่าวอยู่หรือไม่และฉันได้รับสิ่งนี้:

   tcp        0      0 127.0.0.1:9000          0.0.0.0:*               LISTEN

แต่ฉันจะรับ PID ของกระบวนการที่กำลังถืออยู่ได้อย่างไร




netstatคำสั่งอาจทำงานในระบบปฏิบัติการหลายระบบเพื่อให้คุณได้รับนั้นคุณเพียงแค่ต้องหาข้อโต้แย้งที่จะให้แน่ใจว่ามันจะแสดง pids ตามแต่ละพอร์ตที่เปิดที่รู้จัก
Luciano

คำตอบ:


474

บน Linux คุณต้องเป็นรูทหรือเจ้าของกระบวนการเพื่อรับข้อมูลที่คุณต้องการ ดังนั้นกระบวนการที่ทำงานในฐานะผู้ใช้รายอื่นการจัดเตรียมsudoเป็นสิ่งที่คุณต้องการมากที่สุด นอกจากนั้นในระบบ Linux ที่ทันสมัยssเป็นเครื่องมือที่ใช้ในการทำสิ่งนี้:

$ sudo ss -lptn 'sport = :80'
State   Local Address:Port  Peer Address:Port              
LISTEN  127.0.0.1:80        *:*                users:(("nginx",pid=125004,fd=12))
LISTEN  ::1:80              :::*               users:(("nginx",pid=125004,fd=11))

นอกจากนี้คุณยังสามารถใช้การร้องขอเดียวกับที่คุณกำลังใช้อยู่ แต่อย่าลืมsudo:

$ sudo netstat -nlp | grep :80
tcp  0  0  0.0.0.0:80  0.0.0.0:*  LISTEN  125004/nginx

คุณยังสามารถใช้ lsof:

$ sudo lsof -n -i :80 | grep LISTEN
nginx   125004 nginx    3u  IPv4   6645      0t0  TCP 0.0.0.0:80 (LISTEN)

36
หมายเหตุ: ภายใต้ OSX -pตัวเลือกสำหรับโปรโตคอลมากกว่ากระบวนการ ดูคำถามนี้
ไบรอัน P

3
@BryanP สหกรณ์ถามอูบุนตูเพื่อให้เป็นที่ไม่เกี่ยวข้องครับ ...
อดัม B

43
@AdamB เว้นแต่ผู้ใช้ Mac มาที่นี่เพื่อค้นหาFinding the PID of the process using a specific port
mraaroncruz

2
คำตอบนี้อาจได้รับการปรับปรุงให้ดีขึ้นโดยให้ความสำคัญกับsudoด้านบนสุด
Nacht

2
@MrOnyancha ใช้ตัวเลือก terse (-t) -lsof -ti tcp:80
Mohnish

138

นอกจากนี้คุณสามารถใช้lsofยูทิลิตี้ ต้องเป็นคนรูท

# lsof -i :25
COMMAND  PID        USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
exim4   2799 Debian-exim    3u  IPv4   6645      0t0  TCP localhost:smtp (LISTEN)
exim4   2799 Debian-exim    4u  IPv6   6646      0t0  TCP localhost:smtp (LISTEN)

9
คำสั่งนี้ยังจะให้กระบวนการที่มีestablishedการเชื่อมต่อที่ไม่เพียง listeningแต่กระบวนการที่มี
fAllnx

1
ไม่จำเป็นต้องเป็นรูท และสำหรับผู้ที่ต้องการรับ PID เท่านั้นคุณสามารถlsof -i :25 -Fpสร้างผลลัพธ์เช่นp1234นั้นได้
Robert

12

ฉันใช้ "CentOS 7 น้อยที่สุด" ซึ่งมีหรือไม่netstat lsofแต่การแจกแจงลินุกซ์จำนวนมากมีคำสั่งซ็อกเก็ตสถิติ (เช่นss)

นี่คือตัวอย่างของการดำเนินการ:

# ss -tanp | grep 6379
LISTEN   0    128  127.0.0.1:6379   *:*   users:(("redis-server",pid=2531,fd=4))

1
ดูเพิ่มเติมss -pntl 'sport = :6379'
Stéphane Chazelas

10

เรียกใช้คำสั่งที่มีจะให้คุณsudo PIDในเครื่องพัฒนาของฉันฉันจะได้รับ:

$ netstat -nlp | grep 8080
tcp6       0      0 :::8080      :::*       LISTEN      -

$ sudo netstat -nlp | grep 8080
tcp6       0      0 :::8080      :::*       LISTEN      16449/java

และตามที่กล่าวไว้ในคำตอบอื่น ๆ คุณยังสามารถใช้ssหรือlsofคำสั่ง


ใช้คำสั่งเป็นsudoID กระบวนการแสดง
Eugen Konkov

แต่ถ้าsudo netstat -nlp | grep 34157ยังคงแสดง-แทน PID ล่ะ
Eugen Konkov

8

นอกจากนี้คุณสามารถใช้fuser:

fuser -v -n tcp 22

ผลลัพธ์ :

                     USER        PID ACCESS COMMAND
22/tcp:              root        598 F.... sshd

มันไม่ทำงานfuser -v -n tcp 80แม้ว่าฉันจะลองด้วย sudo
SuperKrish

1
หมายเหตุ: สิ่งนี้ต้องการsudoหากกระบวนการที่กระทำผิดเริ่มต้นด้วยsudo
laggingreflex

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