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

我使用了:得到了这个:

netstat -nlp|grep 9000


但是如何获取持有它的进程的PID?

评论

看到这个wilddiary.com/find-the-process-using-a-given-port

在SU上回答–查找在Linux中使用特定端口的进程

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

#1 楼

在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)


评论


注意:在OSX下,-p选项用于协议而不是进程。看到这个问题

–布莱恩·普(Bryan P)
16-4-10在16:51



@BryanP OP要求使用Ubuntu,所以这是无关紧要的...

–亚当B
16-09-21在14:26

@AdamB除非Mac用户到达此处,否则将使用特定端口搜索查找进程的PID

–mraaroncruz
16-10-10在11:05

可以通过将sudo放在顶部来改善此答案。

–纳赫特
17年1月6日在1:10

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

– Mohnish
17年7月19日在13:58

#2 楼

您也可以使用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)


评论


此命令还将为您提供已建立连接的进程,而不仅仅是正在侦听的进程。

– firelynx
15年8月18日在10:10

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

–罗伯特
17 Mar 9 '17 at 10:27

#3 楼

我正在使用既没有netstat也没有lsof的“ CentOS 7 minimal”。但是许多Linux发行版都有套接字统计信息命令(即ss)。这里是一个执行示例:

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


评论


另请参见ss -pntl'sport =:6379'

–StéphaneChazelas
16年11月27日在17:30

#4 楼

使用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
18年5月10日在8:10

但是,如果sudo netstat -nlp | grep 34157仍然显示-而不是PID?

– Eugen Konkov
18年5月10日在8:16

#5 楼

也可以使用fuser

fuser -v -n tcp 22


输出:

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


评论


它不起作用热熔器-v -n tcp 80,即使我尝试使用sudo

– SuperKrish
16 Dec 2'在5:42



注意:如果违规程序也以sudo启动,则需要sudo

–滞后反射
17年1月21日在8:14

通常要记住这是一件好事。除非该命令与Sudo一起运行,否则Linux中的命令通常不会提供有关由root / sudo启动的进程的信息。即使该命令通常不需要sudo才能正确运行,也是如此。

– njfife
17年7月6日在21:15

#6 楼

我正在使用Yocto Linux系统,该系统具有一组有限的可用Linux工具。我设法使用以下命令找到正在运行的端口的进程(使用端口1883找到该进程):

 root@root:~# netstat -lt
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       
tcp        0      0 0.0.0.0:hostmon         0.0.0.0:*               LISTEN      
tcp        0      0 localhost.localdomain:domain 0.0.0.0:*               LISTEN      
tcp        0      0 0.0.0.0:9080            0.0.0.0:*               LISTEN      
tcp        0      0 0.0.0.0:1883            0.0.0.0:*               LISTEN      
tcp        0      0 :::hostmon              :::*                    LISTEN      
tcp        0      0 localhost:domain        :::*                    LISTEN      
tcp        0      0 :::ssh                  :::*                    LISTEN      
tcp        0      0 :::1883                 :::*                    LISTEN      
root@root:~# fuser 1883/tcp
290 
root@root:~# ps | grep 290
  290 mosquitt 25508 S    /usr/sbin/mosquitto -c /etc/mosquitto/mosquitto.conf
12141 root      8444 S    grep 290
  

正如我们在上面看到的,使用端口1883的程序是/usr/sbin/mosquitto