如何解析netstat命令以获取进程名称和PID?

28

我试图确定哪个应用程序正在使用某个端口,并使用netstat -tlnp | grep <port> for Linux命令。

该命令返回以下输出:

(Not all processes could be identified, non-owned process info will not be shown, you would have to be root to see it all.)  
tcp  0  0 0.0.0.0:<port>  0.0.0.0:*  LISTEN  3591/java

我需要仅获取进程的名称和PID,即java 3591。

最好的方法是什么?

谢谢。

8个回答

35

尝试一下

ps -p $(lsof -ti tcp:80) o comm=,pid=
或者
netstat -tlnp | awk '/:80 */ {split($NF,a,"/"); print a[2],a[1]}'

1
谢谢。答案的第二部分有效并已被接受。 - yart
第二个在Ubuntu 13.10上工作,但我需要使用sudo。我稍微修改了一下:sudo netstat -tlnp | awk '/:80 */ {split($NF,a,"/"); print a[1]}' | xargs ps x -p - funroll
这好像不起作用?echo "tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 1080/nginx: master" | awk '/:80 */ {split($NF,a,"/"); print a[2],a[1]}' 返回master - Chris Stryczynski
@ChrisStryczynski:我的netstat输出在列之间包含多个空格,因此在AWK命令中添加一个多空格分隔符似乎可以解决问题:netstat -tlnp | awk -F ' ' '/:80 */ {split($NF,a,"/"); print a[2],a[1]}'(这是-F参数中的两个空格)。 - Dennis Williamson

15

(稍微偏离你的原始问题),我通常使用lsof命令来查找监听特定端口号的进程。例如:

lsof -i tcp:80

如果只想显示进程名称和PID,请使用以下方式解析输出:

lsof | tail -n +2 | awk '{print $1 " " $2}'
tail 命令跳过输出头部,而 awk 打印出所需的列。

为什么要使用 lsof

尝试对 netstat 的输出进行 grep 可能会很麻烦,因为您需要确保匹配正确的列。一个强大的解决方案可能会比较冗长且难以按需求生成(至少对我来说是如此)。 lsof 使您免去了匹配正确端口的麻烦,并且还有许多其他用途,例如我们现在正在做反向操作(查找哪些进程正在使用端口),或确定哪个进程正在使用文件/挂载点(或其反向操作)。请参阅 lsof manpage 以获取更多示例。

2

awk + sed:

awk '{print $7}' | sed "s/\// /g"

1

... | awk '{print $7;}'| sed 's/\// /g'

的程序代码相关的内容。


1

另外,您可以通过将stderr重定向到/dev/null来摆脱“您必须是root”的消息。

netstat -tlnp 2>/dev/null | grep ...

1

现在,如果您在本地端添加一个端口匹配以满足问题的要求,我可能会给您点赞 :) - tink
类似这样的代码? ss -tupln | awk '$5~/:80\>/{print gensub(/users:\(\("([^"]+).*/,"\\1",1,$NF)}' - tink
@tink 为了匹配一个端口,你可以使用ss命令,例如 '( dport = :443 or sport = :https )' - Pablo Bianchi

0
netstat -tlnp 2>/dev/null | awk '/\.[0-9]:X/ {print $7}' | sed 's/\//\s/g'

在awk部分的X是你要查看的端口。

-1

尝试使用netstat -p

-p,--program 显示每个套接字所属程序的PID和名称。


-p <protocol> for os/x - WestCoastProjects

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接