使用特定端口查找过程的PID?


391

我在Ubuntu系统上安装hadoop。当我启动它时,它报告端口9000繁忙。

我用了:

netstat -nlp|grep 9000

看看是否存在这样的端口,我得到了:

   tcp        0      0 127.0.0.1:9000          0.0.0.0:*               LISTEN

但是,如何获取正在保存的进程的PID?




netstat该命令可能在许多操作系统中都可以使用,您只需找到可以确保它将在每个已知打开的端口上显示pid的参数即可。
Luciano '18

Answers:


474

在Linux上,您必须是root用户或进程的所有者才能获取所需的信息。因此,对于以其他用户身份运行的进程,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选项用于协议而不是进程。看到这个问题
Bryan P

3
@BryanP OP要求使用Ubuntu,所以这是无关紧要的……
Adam B

43
@AdamB除非Mac用户到达此处进行搜索Finding the PID of the process using a specific port
mraaroncruz

2
将此需求放在首位可能会改善此答案sudo
Nacht

2
@MrOnyancha使用简洁(-t)选项lsof -ti tcp:80
Mohnish

138

您也可以使用lsof实用程序。需要是root。

# 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
firelynx

1
不一定要扎根。而且,对于只希望获得PID的用户,可以使用lsof -i :25 -Fp,它会产生类似的输出p1234
罗伯特

12

我正在使用netstat既没有也没有的“ CentOS 7 minimal” lsof。但是很多Linux发行版都有socket statistics命令(即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'
斯特凡·夏泽拉斯

10

与运行命令sudo将给您PID。在我的开发机器上,我得到:

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

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

如其他答案中所述,您也可以使用sslsof命令。


正在运行的命令作为sudo显示进程ID
Eugen Konkov,

但是,如果sudo netstat -nlp | grep 34157仍然显示-而不是PID怎么办?
欧根·康科夫

8

您也可以使用fuser

fuser -v -n tcp 22

输出 :

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

它无法正常运行热熔器-v -n tcp 80,即使我尝试使用sudo
SuperKrish

1
注意:这需要sudo确定违规程序是否还始于sudo
laggingreflex

1
通常要记住这是一件好事。除非该命令与Sudo一起运行,否则Linux中的命令通常不会提供有关由root / sudo启动的进程的信息。即使该命令通常不需要sudo才能正确运行,也是如此。
njfife
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.