应使用lsof -i :端口号或netstat -tuln | grep :端口号确认Workerman是否真正在监听目标端口,若无输出说明未成功绑定,若有则需检查监听地址是否为0.0.0.0而非127.0.0.1,并排除防火墙、安全组及残留进程干扰。

查 Workerman 进程是否在监听目标端口
Workerman 默认用 Worker::listen() 启动 TCP/UDP 服务,但不会自动打印监听地址。如果客户端连不上,第一件事是确认进程确实在监听——而不是只启动了但没成功绑定端口。
用 lsof -i :2345(把 2345 换成你的实际端口)直接查端口占用。如果返回空,说明没进程在监听;如果有输出,看 PID 和 COMMAND 列是否匹配你的 Workerman 主进程名(比如 php 或你自定义的 start.php)。
netstat -tuln | grep :2345 效果类似,但更轻量。注意加 -n 避免 DNS 解析拖慢响应,-tul 分别表示 TCP、UDP、监听态、显示 PID/程序名(部分系统需 root 权限才显示 PID)。
- 常见错误:只查
localhost:2345却忽略*:2345——Workerman 默认绑定0.0.0.0,lsof显示为*:2345,不是127.0.0.1:2345 - 如果
lsof报command not found,CentOS/Alpine 等最小化系统可能未预装,用yum install -y psmisc或apk add lsof -
netstat在较新 Linux(如 Ubuntu 22.04+)中已被ss取代,但 Workerman 排查场景下netstat -tuln仍广泛可用,无需强切ss
区分 Workerman 主进程和子进程的监听行为
Workerman 的主进程(master)不处理连接,只 fork 子进程(worker)。真正监听端口的是子进程,但 lsof 和 netstat 默认只显示“谁在监听”,不区分父子关系。这意味着你看到的 PID 很可能是子进程 PID,而非你启动时看到的那个主进程号。
用 lsof -i :2345 -P -n 加 -P(禁用端口名解析)、-n(禁用主机名解析)后,再结合 ps -ef | grep start.php 对比 PID 树。主进程的 PPID 是 1,子进程的 PPID 是主进程 PID。
Zynq‑7000 / Zynq UltraScale+ 硬件调试技能。适用于 Xilinx Zynq(Cortex‑A9/A53 + FPGA)Linux 环境,调试 I2C、I2S、UART、GPIO 等外设。包括设备树配置、内核驱动、用户空间调试工具、交叉编译和常见问题排查,支持 PetaLinux 开发。
- 关键点:重启 Workerman 后,旧子进程可能残留(尤其 signal 处理异常时),导致新进程无法 bind 端口 ——此时
lsof会显示多个 PID 占用同一端口,需手动kill -9清理 - Workerman 日志里若出现
Address already in use,基本可断定端口被占,不用再猜是配置错还是代码错 - 不要依赖
ps aux | grep php找进程——它无法告诉你哪个 PHP 进程真正在 listen,必须靠lsof或netstat实锤
检查防火墙和 SELinux 是否拦截连接
即使 lsof 显示端口已监听,外部仍连不上,大概率是系统层拦截。Workerman 默认无加密、无认证,完全依赖系统网络栈。
先确认本地能连:telnet 127.0.0.1 2345 或 nc -zv 127.0.0.1 2345。通则排除 Workerman 自身问题;不通再查端口监听状态。
- iptables/firewalld:运行
sudo iptables -L -n | grep 2345或sudo firewall-cmd --list-ports,确认端口已放行 - SELinux:CentOS/RHEL 上若启用了 enforcing 模式,Workerman 的 socket 创建可能被拒绝,临时关掉验证:
sudo setenforce 0;长期方案是打 SELinux 策略,非紧急排查时不建议跳过这步 - 云服务器额外注意安全组——
lsof再准也管不了阿里云/腾讯云控制台里的入方向规则
Workerman 配置导致监听失败的典型表现
Workerman 的 $worker->listen() 如果参数写错,lsof 就查不到监听项,但进程仍在跑(只是没干活)。最常见两类错误:
- 协议写错:写成
tcp://0.0.0.0:2345是对的,但误写udp://0.0.0.0:2345而代码实际走 TCP,或反过来 - IP 绑定过死:配置成
127.0.0.1:2345,lsof显示127.0.0.1:2345,但外部访问*:2345就失败——这时lsof -i :2345仍能查到,但得看具体 IP 字段 - 端口被其他服务占用(如 Apache 占了 80,Nginx 占了 443),Workerman 启动日志里会有 warning,但进程不退出,容易被忽略
真正麻烦的是监听成功但连接立即断开——那得看 Workerman 的 onConnect、onMessage 回调里有没有未捕获异常,lsof 和 netstat 查不到这种逻辑层问题。

















