背景
12月3日上午,拨打电话无法拨打,然后登陆freeswitch服务器上进行日志查看,发现日志中出现大量的[ERR] mod_event_socket.c:2891 Socket Error! Could not listen on ,同时重启freeswitch仍然会出现该问题。
定位
定位1:查看本地IP地址。
从报错的信息来看,无法建立监听,那么首先查看服务器的内网IP是否被更改。
从当时查看结果来看,本地的内网IP地址并未被修改,那么由IP修改引起该问题的可能性被排除。
定位2:查看event_socket.conf.xml配置文件。
确定了本地IP地址后,决定监听哪个IP地址则是由配置文件决定,配置文件event_socket.conf.xml的存放地址在(以freeswitch服务器为例):/usr/local/freeswitch/conf/autoload_configs文件夹下。
由配置文件中可以看出监听的ip地址与服务器IP地址相同,那么排除配置文件与实际不同的问题。
定位3:查看服务器端口情况。
由错误信息以及配置文件中可以看出,监听端口为8021,那么就需要查看服务器上8021端口的使用情况。
由命令netstat查看后,发现8021端口处于ESTABLISHED off的状态,也就是连接未释放状态,那么基本可以断定是由于端口未释放所以导致freeswitch启动监听端口无法监听。
解决
既然知道了是由于端口被占用而导致的问题,那么就需要找出来是哪个进程占用的端口,并且关闭或重启该进程。此处使用到一个命令lsof。
使用该命令查出占用该端口程序的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