我可以执行netstat -atulpn | grep java
以查找所有 Java 进程及其附带端口,这很棒,但是我还想显示进程的完整执行参数。从netstat
我迄今为止探索的所有方面来看,我认为这是不可能的,因此我想我必须编写一个脚本来处理输出netstat
,然后将 pid 传递进去ps
,然后美化输出以显示 ip+port 和完整命令行。
有没有更好的方法可以做到这一点,或者这是唯一的选择?
答案1
ss -lnptu 通过调用 ps -p 传送到 awk。我使用的是移动设备,因此目前输入完整的示例有点困难。
监听套接字:
ss -lnptu | awk 'NR>1 { split($7,p,","); printf "Listen: "$5 " Command: "; system("ps --no-headers -o args p "p[2]); }'
所有套接字(由于套接字在 TIME_WAIT 中没有进程信息等,可能需要进行一些额外的过滤):
ss -anptu state listening state established state connected state unconnected | grep -v TIME_WAIT | awk 'NR>1 { split($7,p,","); printf "Listen: "$5 " Command: "; system("ps --no-headers -o args p "p[2]); }'
答案2
ps
当我按原样使用 Mark Sturgill 的答案时,我在 Ubuntu 16.04 上收到错误。需要稍微修改一下才能使其工作:基本上添加了一个额外的内容split
,以进一步将数字 PID 与返回的连接格式隔离开来ss
(例如pid=1306 -> 1306
)。我还添加了-ww
标志以使 ps 输出完整参数:
ss -lnptu | awk 'NR>1 { split($7,p,","); split(p[2],pid,"="); printf "Listen: "$5 " Command: "; system("ps --no-headers -ww -o args p "pid[2]); }'
答案3
@ylluminate,对于 CentOS,将其更改为ss -lnptu | awk 'NR>1 { split($6,p,","); printf "Listen: "$4 " Command: "; system("ps --no-headers -o args p "p[2]); }'