如果我这样使用,后缀守护进程只有名称“master” netsat
:
root@myhost# netstat -tulpen| grep master
tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN 0 53191445 13640/master
Run Code Online (Sandbox Code Playgroud)
如果我使用,ps
我会得到一个更详细的名字:
root@myhost# ps aux| grep 13640
root 13640 0.0 0.0 25036 1500 11:35 0:00 /usr/lib/postfix/master
Run Code Online (Sandbox Code Playgroud)
有没有办法告诉netstat
输出长名称?
在这种情况下,它将是/usr/lib/postfix/master
.
好像是netstat做不到的。如果您知道如何使用其他工具执行此操作,那么这也是一个有效的问题。(但仍首选基于 netstat 的解决方案)。
所有答案都有效。非常感谢您展示您的 Unix 知识。但到目前为止,答案太长/太复杂了。
没有简单的解决办法吗?我可以安装任何需要的工具,但我希望用法简单易用。
有几个答案可以进行后期处理以获得所需的信息。每个答案都使用不同的方式,我不认为一种解决方案比另一种更好。
不幸的是,似乎没有 unix/linux 可以开箱即用。但这不是你的错,你试图帮助我。
不幸的是,我不能对所有答案都给予奖励:-)
我给了信誉点最少的用户赏金。
正如您已经想到的netstat
,默认情况下无法提供cmdline
带有-p
选项的完整输出。根据来源,它似乎仅限于20 个字符,并且只列出了完整 cmdline 的一部分
您可以围绕 netstat 编写自己的包装器以显示完整的详细信息。添加了以下显示完整 cmd 行的 python 代码片段。
#!/usr/bin/env python
from subprocess import Popen,PIPE
out,err = Popen(['netstat','-antlp'],stdout=PIPE).communicate()
for l in out.splitlines():
line = l.split()
if '/' in line[-1]:
p = line[-1].split('/')[0]
line[-1] = str(p) + ' -> ' + open('/proc/'+p+'/cmdline','r').readline().split('-')[0]
print '\t'.join(line)
Run Code Online (Sandbox Code Playgroud)
示例输出:
$ sudo ./netstat.py
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:11443 0.0.0.0:* LISTEN 4007 -> /usr/sbin/apache2
tcp 0 0 192.168.2.125:53 0.0.0.0:* LISTEN 3055 -> /usr/sbin/named
tcp 0 0 172.17.0.1:53 0.0.0.0:* LISTEN 3055 -> /usr/sbin/named
tcp 0 0 192.168.125.1:53 0.0.0.0:* LISTEN 3055 -> /usr/sbin/named
tcp 0 0 192.168.0.200:53 0.0.0.0:* LISTEN 3055 -> /usr/sbin/named
tcp 0 0 127.0.0.1:53 0.0.0.0:* LISTEN 3055 -> /usr/sbin/named
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 3125 -> /usr/sbin/sshd
tcp 0 0 127.0.0.1:631 0.0.0.0:* LISTEN 30845 -> /usr/sbin/cupsd
tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN 3884 -> /usr/sbin/exim4
tcp 0 0 127.0.0.1:953 0.0.0.0:* LISTEN 3055 -> /usr/sbin/named
tcp 0 0 0.0.0.0:32765 0.0.0.0:* LISTEN 3014 -> /sbin/rpc.statd
tcp 0 0 0.0.0.0:8895 0.0.0.0:* LISTEN 4078 -> /home/cv/jdk1.8.0_31/bin/java
tcp 0 0 0.0.0.0:23423 0.0.0.0:* LISTEN 4078 -> /home/cv/jdk1.8.0_31/bin/java
tcp 0 0 0.0.0.0:32767 0.0.0.0:* LISTEN 3827 -> /usr/sbin/rpc.mountd
tcp 0 0 0.0.0.0:23424 0.0.0.0:* LISTEN 4078 -> /home/cv/jdk1.8.0_31/bin/java
tcp 0 0 0.0.0.0:32768 0.0.0.0:* LISTEN -
tcp 0 0 0.0.0.0:2049 0.0.0.0:* LISTEN -
tcp 0 0 0.0.0.0:23523 0.0.0.0:* LISTEN 4078 -> /home/cv/jdk1.8.0_31/bin/java
tcp 0 0 0.0.0.0:23524 0.0.0.0:* LISTEN 4078 -> /home/cv/jdk1.8.0_31/bin/java
tcp 0 0 192.168.0.200:44331 0.0.0.0:* LISTEN 4078 -> /home/cv/jdk1.8.0_31/bin/java
tcp 0 0 0.0.0.0:111 0.0.0.0:* LISTEN 3002 -> /sbin/rpcbind
tcp 0 0 0.0.0.0:8080 0.0.0.0:* LISTEN 4007 -> /usr/sbin/apache2
tcp 0 0 0.0.0.0:6000 0.0.0.0:* LISTEN 3908 -> /usr/bin/Xorg:0
Run Code Online (Sandbox Code Playgroud)
您可以围绕类似的行编写自己的包装器并添加到您的工具箱中!
这是我一段时间以来对“优雅”解决方案最有趣的搜索。谢谢你。
与其解析/proc/pid/cmdline
,不如运行更有意义readlink /proc/pid/exe
。
我设置了一个 shell 函数full
来从中抽象出复杂性——主要是为了节省打字时间。
唯一的依赖项是POSIX 兼容ex
和 Linux 标准readlink
。
在下面的终端输出中,head
为了简洁起见,我已经通过管道进行了处理。
[root@localhost ~]# netstat -tulpen | head
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State User Inode PID/Program name
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 0 9581 1237/sshd
tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN 0 10164 1493/master
tcp 0 0 0.0.0.0:555 0.0.0.0:* LISTEN 0 14326 2824/nc
tcp 0 0 0.0.0.0:46638 0.0.0.0:* LISTEN 29 8848 960/rpc.statd
tcp 0 0 0.0.0.0:111 0.0.0.0:* LISTEN 0 8749 940/rpcbind
tcp 0 0 :::22 :::* LISTEN 0 9583 1237/sshd
tcp 0 0 ::1:25 :::* LISTEN 0 10166 1493/master
tcp 0 0 :::47166 :::* LISTEN 29 8856 960/rpc.statd
[root@localhost ~]# netstat -tulpen | head | full
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State User Inode PID/Program name
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 0 9581 1237/usr/sbin/sshd
tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN 0 10164 1493/usr/libexec/postfix/master
tcp 0 0 0.0.0.0:555 0.0.0.0:* LISTEN 0 14326 2824/usr/bin/nc
tcp 0 0 0.0.0.0:46638 0.0.0.0:* LISTEN 29 8848 960/sbin/rpc.statd
tcp 0 0 0.0.0.0:111 0.0.0.0:* LISTEN 0 8749 940/sbin/rpcbind
tcp 0 0 :::22 :::* LISTEN 0 9583 1237/usr/sbin/sshd
tcp 0 0 ::1:25 :::* LISTEN 0 10166 1493/usr/libexec/postfix/master
tcp 0 0 :::47166 :::* LISTEN 29 8856 960/sbin/rpc.statd
[root@localhost ~]#
Run Code Online (Sandbox Code Playgroud)
它也适用于任何形式的netstat -p
,甚至是在某些行上具有其他尾随数据的形式:
[root@localhost ~]# netstat -p | head
Active Internet connections (w/o servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 10.0.2.15:ssh 10.0.2.2:63550 ESTABLISHED 2557/sshd
Active UNIX domain sockets (w/o servers)
Proto RefCnt Flags Type State I-Node PID/Program name Path
unix 11 [ ] DGRAM 8584 895/rsyslogd /dev/log
unix 2 [ ] DGRAM 9124 1045/hald @/org/freedesktop/hal/udev_event
unix 2 [ ] DGRAM 7116 340/udevd @/org/kernel/udev/udevd
unix 2 [ ] DGRAM 16523 3537/pickup
unix 2 [ ] DGRAM 15036 2865/su
[root@localhost ~]# netstat -p | head | full
Active Internet connections (w/o servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 10.0.2.15:ssh 10.0.2.2:63550 ESTABLISHED 2557/usr/sbin/sshd
Active UNIX domain sockets (w/o servers)
Proto RefCnt Flags Type State I-Node PID/Program name Path
unix 11 [ ] DGRAM 8584 895/sbin/rsyslogd /dev/log
unix 2 [ ] DGRAM 9124 1045/usr/sbin/hald @/org/freedesktop/hal/udev_event
unix 2 [ ] DGRAM 7116 340/sbin/udevd @/org/kernel/udev/udevd
unix 2 [ ] DGRAM 16523 3537/usr/libexec/postfix/pickup
unix 2 [ ] DGRAM 15036 2865/bin/su
[root@localhost ~]#
Run Code Online (Sandbox Code Playgroud)
[root@localhost ~]# type full
full is a function
full ()
{
ex -c 'g/^.*\(\<[0-9]\+\)\/.*$/ya|pu|s::readlink /proc/\1/exe:|.!sh' -c 'g/^\//-ya|pu|-2s/^\(.*\<[0-9]\+\)\/[^[:space:]]*\(.*\)$/\1/|+2s//\2/|-2j!3' -c%p -c 'q!' /dev/stdin
}
[root@localhost ~]#
Run Code Online (Sandbox Code Playgroud)
(即将推出;同时尝试一下,让我知道您喜欢它。)
只是为了好玩我做了这个:
sudo netstat -putan | awk '/master/ {out=""; for(i=1;i<=6;i++){out=out" "$i}; split($7,result,"/"); system("ps aux | grep -v grep | grep " result[1] " >> x&"); getline < "x"; print out " " $14}'
Run Code Online (Sandbox Code Playgroud)
我想这就是你想要的。您始终可以将其用作别名,以简化其使用。
解释:
下一行获取 netstat 的输出并进行过滤master
sudo netstat -putan | awk '/master/
Run Code Online (Sandbox Code Playgroud)
下一行存储 netstat 的输出。
out=""; for(i=1;i<=6;i++){out=out" "$i}
Run Code Online (Sandbox Code Playgroud)
下一行获取 pid:
split($7,result,"/")
Run Code Online (Sandbox Code Playgroud)
下一行从 ps aux 获取全名并打印所有内容
system("ps aux | grep -v grep | grep " result[1] " >> x&"); getline < "x";
Run Code Online (Sandbox Code Playgroud)
最后打印出来:
print out " " $14
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
12888 次 |
最近记录: |