背景

    12月3日上午,拨打电话无法拨打,然后登陆freeswitch服务器上进行日志查看,发现日志中出现大量的[ERR] mod_event_socket.c:2891 Socket Error! Could not listen on ,同时重启freeswitch仍然会出现该问题。

freeswitch 获取坐席注册状态 freeswitch注册不上_端口被占用定位

定位

定位1:查看本地IP地址。

    从报错的信息来看,无法建立监听,那么首先查看服务器的内网IP是否被更改。

freeswitch 获取坐席注册状态 freeswitch注册不上_freeswitch 获取坐席注册状态_02

    从当时查看结果来看,本地的内网IP地址并未被修改,那么由IP修改引起该问题的可能性被排除。

定位2:查看event_socket.conf.xml配置文件。

    确定了本地IP地址后,决定监听哪个IP地址则是由配置文件决定,配置文件event_socket.conf.xml的存放地址在(以freeswitch服务器为例):/usr/local/freeswitch/conf/autoload_configs文件夹下。

freeswitch 获取坐席注册状态 freeswitch注册不上_freeswitch错误定位_03

    由配置文件中可以看出监听的ip地址与服务器IP地址相同,那么排除配置文件与实际不同的问题。

定位3:查看服务器端口情况。

    由错误信息以及配置文件中可以看出,监听端口为8021,那么就需要查看服务器上8021端口的使用情况。

freeswitch 获取坐席注册状态 freeswitch注册不上_freeswitch 获取坐席注册状态_04

    由命令netstat查看后,发现8021端口处于ESTABLISHED off的状态,也就是连接未释放状态,那么基本可以断定是由于端口未释放所以导致freeswitch启动监听端口无法监听。

解决

    既然知道了是由于端口被占用而导致的问题,那么就需要找出来是哪个进程占用的端口,并且关闭或重启该进程。此处使用到一个命令lsof。

freeswitch 获取坐席注册状态 freeswitch注册不上_freeswitch错误定位_05

    使用该命令查出占用该端口程序的pid,然后可以查询出该程序的内容,并且关闭或重启。

    之后再启动freeswitch,可正常启动。

Lsof命令简介

lsof(list open files)是一个列出当前系统打开文件的工具。在linux环境下,任何事物都以文件的形式存在,通过文件不仅仅可以访问常规数据,还可以访问网络连接和硬件。

在本次定位问题中,使用到了

-P : 这个选项约束着端口名称的转换。

 -n : 这个选项约束着主机名称的转换。

 -l : 这个选项约束着登录名的转换。

 +M : 此选项支持本地TCP和UDP端口映射程序的注册报告。

 -i4 :仅列示IPv4协议下的端口。

 -i6 : 仅列示IPv6协议下的端口。

 

使用命令lsof -Pnl +M -i4 | grep 8021后,查询出如下结果:

freeswitc 11871        0   44u  IPv4  549469174      0t0  TCP 192.168.10.10:8021 (LISTEN)

各列依次为:

COMMAND:进程的名称

PID:进程标识符

USER:进程所有者

FD:文件描述符,应用程序通过文件描述符识别该文件。如cwd、txt等

TYPE:文件类型,如DIR、REG等

DEVICE:指定磁盘的名称

SIZE:文件的大小

NODE:索引节点(文件在磁盘上的标识)

NAME:打开文件的确切名称

 

由此我们可以看到当前使用8021端口的进程pid为11871