Windows 通过 Debian CUPS 网络打印异常排查
1. 适用场景
适用于 Windows 通过 Debian CUPS 使用网络打印机时出现的常见问题:
- 小文件可以打印,大文件打印失败;
- 打印任务提交速度很慢;
- Windows 打印机显示“错误”;
- CUPS 接收打印文件很慢;
- 打印任务偶发成功、偶发失败;
- CUPS 出现连接数不足;
- 打印任务长时间停留在传输状态;
- /var/spool/cups/ 中的文件增长非常慢。
2. 查看 CUPS 版本
查看 CUPS 版本:
|
1 |
dpkg-query -W cups |
查看所有 CUPS 相关软件包:
|
1 |
dpkg -l | grep -E '^ii[[:space:]]+cups' |
3. 查看 CUPS 当前配置
查看 cupsd.conf 中实际启用的配置:
|
1 |
grep -vE '^[[:space:]]*(#|$)' /etc/cups/cupsd.conf |
检查连接数、超时、KeepAlive 和请求大小配置:
|
1 |
grep -RniE '^[[:space:]]*(MaxClients|MaxClientsPerHost|ListenBackLog|Timeout|KeepAlive|KeepAliveTimeout|LimitRequestBody|MaxRequestSize)' /etc/cups/ |
如果没有输出,一般表示这些参数没有显式配置,正在使用 CUPS 默认值。
4. 查看 CUPS 错误日志
实时查看错误日志:
|
1 |
tail -f /var/log/cups/error_log |
查看最近 100 行:
|
1 |
tail -100 /var/log/cups/error_log |
重点关注:
|
1 2 3 4 5 6 7 |
Max clients reached Timeout Broken pipe Connection reset Filter failed Backend failed client-error |
如果出现:
|
1 |
Max clients reached, holding new connections... |
表示 CUPS 当前客户端连接数已经达到上限,新连接会进入等待状态。
这种情况下可能出现:
- 小文件打印也很慢;
- 大文件长时间上传;
- Windows 打印机最终显示错误;
- /var/spool/cups/ 中打印数据增长非常慢。
5. 查看 CUPS 631 端口连接情况
5.1 查看当前连接总数
|
1 |
ss -Hnt sport = :631 | wc -l |
5.2 查看详细连接
|
1 |
ss -Hnt sport = :631 |
5.3 查看连接状态统计
|
1 |
ss -Hnt sport = :631 | awk '{print $1}' | sort | uniq -c |
例如:
|
1 |
101 ESTAB |
表示当前有 101 个已建立连接。
5.4 查看各客户端 IP 占用的连接数
|
1 |
ss -Hnt sport = :631 | awk '{print $5}' | sed -E 's/:[0-9]+$//' | sort | uniq -c | sort -nr | head -20 |
用于快速判断是否某一台 Windows 占用了大量 CUPS 连接。
5.5 实时查看 CUPS 总连接数
|
1 |
watch -n 1 'ss -Hnt sport = :631 | wc -l' |
每秒自动刷新一次。
5.6 推荐:实时查看各客户端连接数量
现场排查时建议优先使用:
|
1 |
watch -n 1 "ss -Hnt sport = :631 | awk '{print \$5}' | sed -E 's/:[0-9]+$//' | sort | uniq -c | sort -nr | head" |
显示效果类似:
|
1 2 3 4 5 |
Every 1.0s 95 192.168.1.100 8 192.168.1.101 2 192.168.1.102 |
该命令可以实时观察:
- 哪个客户端 IP 占用了大量连接;
- 某个 Windows 的连接数是否持续增加;
- Windows Print Spooler 停止后连接是否立即下降;
- Max clients reached 出现时主要是哪台机器造成的。
5.7 查看指定客户端连接数量
|
1 |
ss -Hnt sport = :631 | grep '客户端IP' | wc -l |
例如:
|
1 |
ss -Hnt sport = :631 | grep '192.168.1.100' | wc -l |
6. 调整 CUPS 最大连接数和超时
如果确认存在:
|
1 |
Max clients reached, holding new connections... |
或者当前环境打印机数量较多、Windows 客户端较多,可以适当提高 CUPS 最大连接数。
编辑:
|
1 |
vi /etc/cups/cupsd.conf |
在全局配置区域增加:
|
1 2 3 4 5 6 7 8 |
MaxClients 500 # CUPS 最大客户端连接数 MaxClientsPerHost 300 # 单个客户端允许的最大连接数 ListenBackLog 512 # TCP 等待连接队列 Timeout 3600 # 请求超时时间,单位秒 KeepAlive Yes # 是否启用 HTTP 长连接 KeepAliveTimeout 120 # KeepAlive 空闲超时时间 LimitRequestBody 0 # HTTP 请求大小限制,0 表示不限制 |
不要放在:
|
1 2 |
<Location> <Policy> |
等配置块内部。
修改前可备份:
|
1 |
cp -a /etc/cups/cupsd.conf /etc/cups/cupsd.conf.bak.$(date +%F-%H%M%S) |
检查配置:
|
1 |
cupsd -t |
如果没有任何输出,一般表示配置语法正常。
重新启动:
|
1 |
systemctl restart cups |
查看状态:
|
1 |
systemctl status cups --no-pager |
然后继续观察:
|
1 |
tail -f /var/log/cups/error_log |
确认是否还出现:
|
1 |
Max clients reached |
7. 查看打印请求是否成功到达 CUPS
实时查看访问日志:
|
1 |
tail -f /var/log/cups/access_log |
查看最近记录:
|
1 |
tail -100 /var/log/cups/access_log |
成功打印通常会出现类似:
|
1 2 3 |
POST /printers/打印机名称 HTTP/1.1 200 Print-Job successful-ok |
其中:
|
1 |
Print-Job successful-ok |
表示打印任务已经成功提交给 CUPS。
如果 Windows 显示错误,但服务器日志已经出现:
|
1 |
Print-Job successful-ok |
说明任务已经到达 CUPS,应继续检查 CUPS 后续处理或 Windows 打印状态。
如果完全没有对应的 Print-Job,则优先检查:
|
1 2 3 4 |
Windows 打印服务 Windows 打印机端口 IPP 网络连接 |
8. 查看打印任务状态
查看全部历史任务:
|
1 |
lpstat -W all -o |
查看尚未完成的任务:
|
1 |
lpstat -W not-completed -o |
查看指定打印机历史任务:
|
1 |
lpstat -W all -o 打印机名称 |
查看指定打印机未完成任务:
|
1 |
lpstat -W not-completed -o 打印机名称 |
查看打印机当前状态:
|
1 |
lpstat -p 打印机名称 -l |
如果:
|
1 |
lpstat -W not-completed -o 打印机名称 |
没有输出,并且:
|
1 |
lpstat -p 打印机名称 -l |
显示:
|
1 |
打印机目前空闲 |
通常表示任务已经处理完成。
9. 查看打印文件接收速度
打印过程中实时查看:
|
1 |
watch -n 1 'ls -lh /var/spool/cups/' |
常见打印数据文件类似:
|
1 2 |
d00001-001 d00002-001 |
重点观察文件大小变化。
例如:
|
1 2 3 4 |
10K 20K 30K 40K |
长时间缓慢增长,说明 Windows 向 CUPS 传输打印数据非常慢。
如果正常,则应该能明显看到:
|
1 2 3 4 |
500K 1M 2M 5M |
快速增长。
如果提高 MaxClients 后 spool 文件增长速度明显恢复,通常说明原来存在 CUPS 连接拥塞。
10. 判断大文件是否受到大小限制
检查配置:
|
1 |
grep -RniE '^[[:space:]]*(LimitRequestBody|MaxRequestSize)' /etc/cups/ |
如果配置了类似:
|
1 |
LimitRequestBody 5242880 |
则:
|
1 |
5242880 Bytes = 5 MB |
超过该大小的打印任务可能被拒绝。
如不需要限制,可以使用:
|
1 |
LimitRequestBody 0 |
修改后:
|
1 2 |
cupsd -t systemctl restart cups |
如果 CUPS access log 中出现:
|
1 |
413 |
需要重点检查请求大小限制。
11. 排查 Windows 客户端连接异常
如果发现某一台 Windows 长期占用几十甚至上百个 631 连接,需要检查客户端 Print Spooler。
让用户以管理员身份打开 CMD。
11.1 停止 Windows 打印服务
|
1 |
net stop spooler |
然后 Debian 上观察:
|
1 |
watch -n 1 "ss -Hnt sport = :631 | awk '{print \$5}' | sed -E 's/:[0-9]+$//' | sort | uniq -c | sort -nr | head" |
或者:
|
1 |
ss -Hnt sport = :631 | grep '客户端IP' | wc -l |
如果停止 spooler 后,该客户端大量连接立即消失,则可以确认这些连接来自 Windows 打印服务。
11.2 启动 Windows 打印服务
|
1 |
net start spooler |
然后继续观察 CUPS 连接数量。
如果启动以后连接数又快速增长,则应重点检查该 Windows 的打印机配置。
11.3 Windows 查看 CUPS 连接
|
1 |
netstat -ano | findstr "CUPS服务器IP:631" |
例如:
|
1 |
TCP 192.168.1.100:50001 192.168.1.10:631 ESTABLISHED 1234 |
最后一列:
|
1 |
1234 |
是进程 PID。
查询进程:
|
1 |
tasklist /FI "PID eq 1234" |
如果显示:
|
1 |
spoolsv.exe |
说明连接由 Windows Print Spooler 创建。
11.4 检查 Windows 中的网络打印机
进入:
|
1 2 |
控制面板 → 设备和打印机 |
重点检查:
- 是否安装了大量网络打印机;
- 是否存在已经停用的打印机;
- 是否存在重复打印机;
- 是否存在大量指向同一个 CUPS 服务器的 IPP 打印机。
不再使用的打印机建议删除,避免 Windows 持续查询打印机状态,占用大量 IPP 连接。
12. Windows 打印失败时查看事件日志
管理员 CMD 开启 PrintService Operational 日志:
|
1 |
wevtutil sl Microsoft-Windows-PrintService/Operational /e:true |
打印失败以后查看:
|
1 |
wevtutil qe Microsoft-Windows-PrintService/Operational /c:30 /rd:true /f:text |
也可以查看:
|
1 |
wevtutil qe Microsoft-Windows-PrintService/Admin /c:30 /rd:true /f:text |
用于分析:
|
1 2 3 4 |
驱动错误 IPP错误 Spooler错误 打印任务失败 |
13. 常见现象快速判断
| 现象 | 优先判断 |
| Max clients reached | CUPS 最大连接数已达到上限 |
| 631 端口大量 ESTABLISHED | Windows/IPP 连接过多 |
| 单个客户端占几十或上百连接 | Windows Print Spooler 或打印机配置异常 |
| Print-Job successful-ok | 打印任务已经成功提交到 CUPS |
| lpstat -W not-completed 无输出 | 当前没有未完成任务 |
| 打印机显示 idle/空闲 | 当前没有正在处理任务 |
| spool 文件增长非常慢 | 网络传输慢或 CUPS 连接拥塞 |
| 小文件成功,大文件失败 | 优先检查连接数、传输速度、超时 |
| 调大 MaxClients 后恢复 | 原 CUPS 最大连接数可能过低 |
| HTTP 413 | 请求大小超过限制 |
| Filter failed | CUPS filter/驱动问题 |
| Backend failed | 打印后端或设备通信问题 |
| Windows 报错但 CUPS 已完成 | Windows IPP 状态或驱动兼容问题 |
| 大量连接在停止 spooler 后消失 | Windows Print Spooler 是连接来源 |
14. 推荐排查顺序
遇到 Windows 网络打印异常时,建议按照下面顺序进行。
第一步:查看 CUPS 错误
|
1 |
tail -100 /var/log/cups/error_log |
重点检查:
|
1 2 3 4 5 |
Max clients reached Timeout Broken pipe Filter failed Backend failed |
第二步:实时查看客户端连接数量
推荐:
|
1 |
watch -n 1 "ss -Hnt sport = :631 | awk '{print \$5}' | sed -E 's/:[0-9]+$//' | sort | uniq -c | sort -nr | head" |
这是排查连接数问题最实用的命令之一。
第三步:查看打印请求是否进入 CUPS
|
1 |
tail -f /var/log/cups/access_log |
重点看:
|
1 |
Print-Job successful-ok |
第四步:观察打印文件传输
|
1 |
watch -n 1 'ls -lh /var/spool/cups/' |
判断打印数据是否快速增长。
第五步:查看未完成任务
|
1 |
lpstat -W not-completed -o |
第六步:查看打印机状态
|
1 |
lpstat -p 打印机名称 -l |
第七步:排查异常 Windows 客户端
停止:
|
1 |
net stop spooler |
观察 Debian 连接是否下降。
再启动:
|
1 |
net start spooler |
继续观察。
15. 快速排查命令汇总
现场可直接依次执行:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 |
tail -100 /var/log/cups/error_log ss -Hnt sport = :631 | wc -l watch -n 1 "ss -Hnt sport = :631 | awk '{print \$5}' | sed -E 's/:[0-9]+$//' | sort | uniq -c | sort -nr | head" tail -f /var/log/cups/access_log watch -n 1 'ls -lh /var/spool/cups/' lpstat -W not-completed -o lpstat -t |
如果确认连接数不足:
|
1 |
vi /etc/cups/cupsd.conf |
参考配置:
|
1 2 3 4 5 6 7 8 |
MaxClients 500 MaxClientsPerHost 300 ListenBackLog 512 Timeout 3600 KeepAlive Yes KeepAliveTimeout 120 LimitRequestBody 0 |
然后:
|
1 2 3 |
cupsd -t systemctl restart cups |
16. 排查思路总结
建议按照以下思路判断:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
打印异常 ↓ 查看 error_log ↓ 是否 Max clients reached ↓ 查看 631 连接数量和来源 IP ↓ 查看 Print-Job 是否 successful-ok ↓ 查看 /var/spool/cups/ 文件增长速度 ↓ 查看 lpstat 是否存在未完成任务 ↓ 检查 CUPS filter/backend ↓ 最后检查 Windows Print Spooler、IPP、驱动和打印机配置 |
总体上应优先区分问题属于:
|
1 2 3 4 5 6 7 8 9 |
Windows 客户端 ↓ IPP / 网络传输 ↓ CUPS 服务 ↓ CUPS Filter ↓ 打印后端 |
这样可以避免一开始就盲目修改参数。