Linux找出哪个进程正在监听端口
我如何找出正在运行的进程与Linux上的每个开放端口相关联?
我如何找出使用Linux在CLI下打开TCP端口#111或者UDP端口7000的进程?
端口不过是计算机网络中使用的通信端点。
您在硬件级别具有物理或者无线连接。
在软件或者操作系统级别,端口充当逻辑构造,并充当SSH,HTTPD等网络服务的通信端口。
TCP和UDP是最常见的端口。
TCP是传输控制协议的缩写。
UDP是用户数据报协议的缩写。
在此处查看UDP和TCP Internet协议之间的几个区别。
该页面显示Linux命令,以找出哪个进程在TCP或者UDP端口上列出。
Linux找出哪个进程正在监听端口
您可以使用以下程序查找端口号及其相关过程:
- " netstat命令"或者" ss命令"是一种命令行工具,它显示网络连接,路由表和许多网络接口统计信息。
- fuser command命令行工具,用于使用文件或者套接字标识进程。
- lsof command是一个命令行工具,用于列出Linux/UNIX下的打开文件,以报告所有打开文件的列表以及打开它们的进程。
/proc/$pid /
文件系统在Linux下/proc在/proc/PID处包含每个正在运行的进程(包括内核进程)的目录,其中包含有关该进程的信息,尤其是包括打开端口的进程名称。
您必须以root用户身份在命令上方运行。
Linux netstat命令找出端口上列出了哪个进程
执行以下命令:
# netstat -tulpn
输出示例:
Active Internet connections (only servers) Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name tcp 0 0 127.0.0.1:3306 0.0.0.0:* LISTEN 1138/mysqld tcp 0 0 0.0.0.0:111 0.0.0.0:* LISTEN 850/portmap tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 1607/apache2 tcp 0 0 0.0.0.0:55091 0.0.0.0:* LISTEN 910/rpc.statd tcp 0 0 192.168.122.1:53 0.0.0.0:* LISTEN 1467/dnsmasq tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 992/sshd tcp 0 0 127.0.0.1:631 0.0.0.0:* LISTEN 1565/cupsd tcp 0 0 0.0.0.0:7000 0.0.0.0:* LISTEN 3813/transmission tcp6 0 0 :::22 :::* LISTEN 992/sshd tcp6 0 0 ::1:631 :::* LISTEN 1565/cupsd tcp6 0 0 :::7000 :::* LISTEN 3813/transmission udp 0 0 0.0.0.0:111 0.0.0.0:* 850/portmap udp 0 0 0.0.0.0:662 0.0.0.0:* 910/rpc.statd udp 0 0 192.168.122.1:53 0.0.0.0:* 1467/dnsmasq udp 0 0 0.0.0.0:67 0.0.0.0:* 1467/dnsmasq udp 0 0 0.0.0.0:68 0.0.0.0:* 3697/dhclient udp 0 0 0.0.0.0:7000 0.0.0.0:* 3813/transmission udp 0 0 0.0.0.0:54746 0.0.0.0:* 910/rpc.statd
TCP端口3306由具有PID 1138的mysqld进程打开。
您可以使用/proc进行验证,执行:
# ls -l /proc/1138/exe
输出示例:
lrwxrwxrwx 1 root root 0 2010-10-29 10:20 /proc/1138/exe -> /usr/sbin/mysqld
您可以使用grep命令或者egrep命令来过滤掉信息:
# netstat -tulpn | grep :80
输出示例:
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 1607/apache2
关于ss命令的注意事项
一些Linux发行版认为nestat命令已被弃用,因此应逐步淘汰,以支持更现代的替代方法,例如ss命令。
语法为:
$ sudo ss -tulpn $ sudo ss -tulpn | grep :3306
fuser命令
找出打开tcp端口7000的进程PID,执行:
# fuser 7000/tcp
输出示例:
7000/tcp: 3813
最后,找出与PID 3813相关的过程名称,执行:
# ls -l /proc/3813/exe
输出示例:
lrwxrwxrwx 1 Hyman Hyman 0 2010-10-29 11:00 /proc/3813/exe -> /usr/bin/transmission
/usr/bin/transmission是一个Bittorrent客户端,执行:
# man transmission
或者
# whatis transmission
输出示例:
transmission (1) - a bittorrent client
找出进程的当前工作目录
要查找名为bittorrent或者pid 3813的进程的当前工作目录,请执行:
# ls -l /proc/3813/cwd
输出示例:
lrwxrwxrwx 1 Hyman Hyman 0 2010-10-29 12:04 /proc/3813/cwd -> /home/Hyman
或者使用pwdx命令,执行:
# pwdx 3813
输出示例:
3813: /home/Hyman
查找Linux上进程的所有者
使用以下命令找出名为3813的进程PID的所有者:
# ps aux | grep 3813
或者
# ps aux | grep '[3]813'
输出示例:
Hyman 3813 1.9 0.3 188372 26628 ? Sl 10:58 2:27 transmission
或者尝试以下ps命令:
# ps -eo pid,user,group,args,etime,lstart | grep '[3]813'
输出示例:
3813 Hyman Hyman transmission 02:44:05 Fri Oct 29 10:58:40 2010
另一个选项是/proc/$PID/environ,执行:
# cat /proc/3813/environ
或者
# grep --color -w -a USER /proc/3813/environ
lsof命令示例
执行命令,如下所示:
lsof -i :portNumber lsof -i tcp:portNumber lsof -i udp:portNumber lsof -i :80 lsof -i :80 | grep LISTEN
输出示例:
apache2 1607 root 3u IPv4 6472 0t0 TCP *:www (LISTEN) apache2 1616 www-data 3u IPv4 6472 0t0 TCP *:www (LISTEN) apache2 1617 www-data 3u IPv4 6472 0t0 TCP *:www (LISTEN) apache2 1618 www-data 3u IPv4 6472 0t0 TCP *:www (LISTEN) apache2 1619 www-data 3u IPv4 6472 0t0 TCP *:www (LISTEN) apache2 1620 www-data 3u IPv4 6472 0t0 TCP *:www (LISTEN)
现在,您将获得有关pid 1607或者1616等的更多信息:
# ps aux | grep '[1]616'
输出示例:
www-data 1616 0.0 0.0 35816 3880 ? S 10:20 0:00 /usr/sbin/apache2 -k start
我建议使用以下命令来获取有关pid 1616的信息:
# ps -eo pid,user,group,args,etime,lstart | grep '[1]616'
输出示例:
1616 www-data www-data /usr/sbin/apache2 -k start 03:16:22 Fri Oct 29 10:20:17 2010
其中:
1616
:PIDwww-date
:用户名(所有者EUID)www-date
:组名(组EGID)/usr/sbin/apache2 -k start
:命令名称及其参数03:16:22
:自流程开始以来经过的时间,格式为[[dd-] hh:] mm:ss。Fri Oct 29 10:20:17 2010
:命令启动的时间。
/etc/services文件
/etc/services文件用于将端口号和协议映射到服务名称。
尝试匹配端口号:
$ grep port /etc/services $ grep 443 /etc/services
输出示例:
https 443/tcp # http protocol over TLS/SSL https 443/udp