我有一台 centos 6.5 机器,在端口 9000 上运行 java 服务器套接字。这一切一直运行良好,突然当我尝试使用此命令 java myService 启动它时,似乎什么都不起作用。以下是我尝试查找它无法运行的原因的一些命令。
# netstat -tpl
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 *:sunrpc *:* LISTEN 1762/rpcbind
tcp 0 0 *:ssh *:* LISTEN 7105/sshd
tcp 0 0 localhost:ipp *:* LISTEN 1911/cupsd
tcp 0 0 localhost:smtp *:* LISTEN 2128/master
tcp 0 0 *:41002 *:* LISTEN 1883/rpc.statd
tcp 0 0 *:sunrpc *:* LISTEN 1762/rpcbind
tcp 0 0 *:http *:* LISTEN 5914/httpd
tcp 0 0 *:ssh *:* LISTEN 7105/sshd
tcp 0 0 localhost:ipp *:* LISTEN 1911/cupsd
tcp 0 0 localhost:smtp *:* LISTEN 2128/master
tcp 0 0 *:33914 *:* LISTEN 1883/rpc.statd
tcp 0 0 *:15003 *:* LISTEN 4695/java
我还运行此命令来查找以下结果。
$ grep -e 9000 -e 9700 -e 9900 /etc/services
cslistener 9000/tcp # CSlistener
cslistener 9000/udp # CSlistener
board-roar 9700/tcp # Board M.I.T. Service
board-roar 9700/udp # Board M.I.T. Service
iua 9900/tcp # IUA
iua 9900/udp # IUA
iua 9900/sctp # IUA
令人困惑的是,虽然它一直运行良好,但当我启动原始服务时,却突然看不到它在端口 9000 上监听?这可能是什么问题?
答案1
在Linux/Unix下,通常一次只有一个应用程序可以访问TCP端口。
如果您有程序在监听端口 9000,然后尝试在该端口上运行其他程序,第二个应用程序将拒绝启动。
对于您来说,您首先需要确定正在监听的应用程序是什么。
但是,在我开始列出命令之前,您必须以 root 用户或具有系统管理员权限的用户身份运行所有这些命令,如果不这样做,那么您将只能看到允许运行用户看到的输出。
这lsof命令可用于获取机器上打开的所有端口的列表,以及打开这些端口的进程的名称。
在我的情况下输入
lsof -i -n -P
给出以下输出
postgres 16507 postgres 8u IPv4 10293 0t0 UDP 127.0.0.1:38068->127.0.0.1:38068
postgres 16507 postgres 9u IPv4 2626399 0t0 TCP 127.0.0.1:5432->127.0.0.1:43769 (ESTABLISHED)
postgres 16508 postgres 8u IPv4 10293 0t0 UDP 127.0.0.1:38068->127.0.0.1:38068
postgres 16508 postgres 9u IPv4 2631818 0t0 TCP 127.0.0.1:5432->127.0.0.1:43770 (ESTABLISHED)
postgres 16509 postgres 8u IPv4 10293 0t0 UDP 127.0.0.1:38068->127.0.0.1:38068
postgres 16509 postgres 9u IPv4 2631575 0t0 TCP 127.0.0.1:5432->127.0.0.1:43771 (ESTABLISHED)
postgres 16510 postgres 8u IPv4 10293 0t0 UDP 127.0.0.1:38068->127.0.0.1:38068
postgres 16510 postgres 9u IPv4 2631576 0t0 TCP 127.0.0.1:5432->127.0.0.1:43772 (ESTABLISHED)
postgres 16511 postgres 8u IPv4 10293 0t0 UDP 127.0.0.1:38068->127.0.0.1:38068
postgres 16511 postgres 9u IPv4 2631825 0t0 TCP 127.0.0.1:5432->127.0.0.1:43773 (ESTABLISHED)
postgres 16512 postgres 8u IPv4 10293 0t0 UDP 127.0.0.1:38068->127.0.0.1:38068
postgres 16512 postgres 9u IPv4 2631826 0t0 TCP 127.0.0.1:5432->127.0.0.1:43774 (ESTABLISHED)
cleanup 16513 postfix 15u IPv4 2626405 0t0 TCP 127.0.0.1:43775->127.0.0.1:5432 (ESTABLISHED)
cleanup 16513 postfix 16u IPv4 2631596 0t0 TCP 127.0.0.1:43776->127.0.0.1:5432 (ESTABLISHED)
postgres 16514 postgres 8u IPv4 10293 0t0 UDP 127.0.0.1:38068->127.0.0.1:38068
postgres 16514 postgres 9u IPv4 2631595 0t0 TCP 127.0.0.1:5432->127.0.0.1:43775 (ESTABLISHED)
postgres 16515 postgres 8u IPv4 10293 0t0 UDP 127.0.0.1:38068->127.0.0.1:38068
postgres 16515 postgres 9u IPv4 2626409 0t0 TCP 127.0.0.1:5432->127.0.0.1:43776 (ESTABLISHED)
postgres 18500 postgres 8u IPv4 10293 0t0 UDP 127.0.0.1:38068->127.0.0.1:38068
postgres 18500 postgres 9u IPv4 2451534 0t0 TCP 127.0.0.1:5432->127.0.0.1:36938 (ESTABLISHED)
postgres 18689 postgres 8u IPv4 10293 0t0 UDP 127.0.0.1:38068->127.0.0.1:38068
postgres 18689 postgres 9u IPv4 2452045 0t0 TCP 127.0.0.1:5432->127.0.0.1:36981 (ESTABLISHED)
postgres 22048 postgres 8u IPv4 10293 0t0 UDP 127.0.0.1:38068->127.0.0.1:38068
postgres 22048 postgres 9u IPv4 2472075 0t0 TCP 127.0.0.1:5432->127.0.0.1:37727 (ESTABLISHED)
root@poweredge2:/proc#
出于显而易见的原因,我净化了一些输出
如您所见,在远列中,有许多行包含“127.0.0.1:00000”,其中 00000 是端口号。
如果对此应用 grep,那么您应该能够过滤掉使用端口 9000 的应用程序,例如:
lsof -i -n -P | grep 5432
我在测试的系统上的端口 9000 上没有运行任何程序,因此从图片中可以看到我使用了端口 5432(我碰巧知道该端口上有一个 postgres 实例正在运行)
一旦您获得了正在监听相关端口的可疑应用程序列表,如果您查看前两列,您将看到应用程序名称和进程 ID。
例如,在上面的图片中,最底下的 Postgress 服务正在使用 pid = 22048
如果我当时使用
kill 22048
然后操作系统将终止该进程,并释放其正在监听的端口。
警告
毋庸置疑,在实时运行的系统中随意终止进程既危险又不负责任。请确保您有终止这些进程的权限,并且 100% 确定您已识别正确的程序。
如果你在没有权限的系统上执行此操作,你很可能会陷入一大堆麻烦,故事的主角是:
按下回车键前请三思
或者,如果您无法终止监听端口 9000 的进程,那么您应该尝试重新配置您想要运行的服务,以监听不同的端口。