乐于分享
好东西不私藏

【Azure Container App】Debug Console的调试工具试验(二)– lsof/ util-linux / netcat / wget

本文最后更新于2026-03-11,某些文章具有时效性,若有错误或已失效,请在下方留言或联系老夜

【Azure Container App】Debug Console的调试工具试验(二)– lsof/ util-linux / netcat / wget

文章“【Azure Container App】Debug Console的调试工具指南”中,介绍了12种Azure Contianer App Debug Console模式下预装的调试工具。

文章“【Azure Container App】Debug Console的调试工具试验(一)– iputils / net-tools / procps” 中,进一步通过试验的方式介绍了前三种工具。

本文继续前文的试验,开始试验  lsof/ util-linux / netcat / wget  这四种工具 。

4. lsof – 文件与端口侦探

lsof(List Open Files)是 Linux 系统中功能最强大的诊断工具之一。在 Unix/Linux 的设计哲学中,”一切皆文件”——不仅普通文件是文件,网络连接、管道、设备、目录等都被抽象为文件。因此,lsof 不仅能查看普通文件的打开情况,还能查看网络连接、管道、设备等所有类型的文件描述符。

在容器故障排查中,lsof 最常用于两个场景:一是查看端口占用情况,二是分析文件句柄泄漏问题。当你需要知道某个端口被哪个进程占用时,lsof -i :8080 可以立即给出答案。当应用报告 “Too many open files” 错误时,lsof -p <PID> 可以列出该进程打开的所有文件,帮助你分析是什么类型的文件描述符被大量打开。

lsof 的输出包含丰富的信息:COMMAND(进程名)、PID(进程 ID)、USER(用户)、FD(文件描述符)、TYPE(类型,如 REG 表示普通文件,IPv4/IPv6 表示网络连接)、DEVICE(设备)、SIZE/OFF(大小/偏移)、NODE(节点)、NAME(文件名或网络地址)。通过分析这些信息,可以深入了解进程的文件和网络活动。

试验指令:

# 查看占用特定端口的进程lsof -i :80# 查看某进程打开的所有文件lsof -p <PID># 统计进程打开的文件数量lsof -p <PID> | wc -l# 查看所有网络连接lsof -i# 查看所有 TCP 连接lsof -i TCP# 查看连接到特定主机的进程lsof -i @10.0.0.1# 查看特定用户打开的文件lsof -u username

效果截图:

典型场景:

当应用报错 “Too many open files” 或 “Cannot allocate file descriptor” 时,首先使用 lsof -p <PID> | wc -l 统计进程打开的文件数量,然后与系统限制(ulimit -n)对比。

如果确实接近或超过限制,使用 lsof -p <PID> 详细查看打开的文件列表。

如果发现大量 socket 类型的文件描述符,可能是连接池泄漏;

如果发现大量普通文件,可能是日志文件或临时文件没有正确关闭。


5. util-linux – 系统管理瑞士军刀

util-linux 是一个庞大的系统管理工具集,包含了数十个实用命令,几乎涵盖了 Linux 系统管理的方方面面。在容器调试场景中,最常用的命令包括 dmesg(查看内核日志)、mount(查看挂载点)、df(查看磁盘使用)、kill(发送进程信号)和 uname(查看系统信息)。

dmesg 命令用于查看内核环形缓冲区中的消息,这些消息包含了系统启动信息、硬件检测、驱动加载以及各种内核级别的事件和错误。在容器环境中,虽然容器与宿主机共享内核,但 dmesg 仍然能够提供有价值的诊断信息。例如,当容器因为内存不足被 OOM Killer 杀死时,相关信息会记录在内核日志中。

ps:dmesg 不可用,没有操作权限,错误消息: read kernel buffer failed: Operation not permitted

mount 命令显示当前系统的所有挂载点。在容器中,你可以看到根文件系统、各种特殊文件系统(如 proc、sys、cgroup)以及通过 Volume 挂载的外部存储。这对于验证存储配置、排查文件访问问题非常有帮助。

df 命令显示文件系统的磁盘空间使用情况。当容器报告磁盘空间不足时,df -h 可以快速定位是哪个文件系统空间不足。在容器环境中,需要特别关注 / 根文件系统和挂载的持久化存储的使用情况。

试验指令:

# 查看内核日志(最后 50 行)dmesg | tail -50# 查看内核日志中的错误和警告dmesg --level=err,warn# 持续监控内核日志(实时显示新消息)dmesg -w# 查看所有挂载点(格式化输出)mount | column -t# 查看磁盘使用情况(人类可读格式)df -h# 查看系统信息uname -a# 优雅终止进程(SIGTERM)kill -15 <PID># 强制终止进程(SIGKILL)kill -9 <PID>

效果截图: 

典型场景:

当容器突然崩溃或出现异常行为时,dmesg 是第一个要查看的地方。如果看到 “Out of memory: Kill process” 相关日志,说明容器内存配置不足,需要增加内存限制或优化应用内存使用。

如果看到 “segfault” 相关信息,说明应用存在内存访问错误,可能是程序 bug 或依赖库问题。

如果看到磁盘 I/O 错误,需要检查存储系统的健康状况。


6. netcat (nc) – 网络连接瑞士军刀

netcat(简称 nc)被誉为网络工具中的”瑞士军刀”,它可以建立几乎任何类型的网络连接。无论是测试 TCP/UDP 端口连通性、创建简单的客户端/服务端、传输数据,还是进行端口扫描,netcat 都能轻松胜任。它是网络调试中最灵活、最实用的工具之一。

netcat 的核心能力是建立 TCP 或 UDP 连接并在连接上读写数据。在最简单的使用场景中,你可以用 nc -zv host port 测试端口是否可达:-z 表示零 I/O 模式(只测试连接,不发送数据),-v 表示详细输出。这比 telnet 更加简洁高效,是验证网络连通性的首选方法。

netcat 还可以作为简单的服务器使用。通过 nc -l -p 8080 可以在 8080 端口启动一个监听服务,任何连接到该端口的数据都会显示在终端上。这对于测试网络配置、验证防火墙规则非常有用。你甚至可以用它来创建简单的 HTTP 服务器或进行文件传输。

在进行 HTTP 测试时,netcat 可以发送原始的 HTTP 请求。通过 echo -e "GET / HTTP/1.1\r\nHost: example.com\r\n\r\n" | nc example.com 80 可以手工构造并发送 HTTP 请求,查看服务器的原始响应。这对于调试 HTTP 协议问题、验证反向代理配置非常有帮助。

试验指令:

# 测试 TCP 端口连通性nc -zv target-host 443# 设置连接超时(5 秒)nc -w 5 -zv target-host 3306# 测试 UDP 端口nc -u -zv target-host 53 # 简单的端口扫描(扫描常用端口)nc -zv target-host 22 80 443 3306 6379

效果截图:

典型场景:

当应用无法连接数据库或外部 API 时,使用 nc -zv db-host 3306 可以快速验证网络层面是否可达。

如果 nc 连接成功(显示 “succeeded”),说明网络是通的,问题可能在应用层(如认证失败、TLS 配置错误);

如果 nc 连接失败(显示 “Connection refused” 或 “Connection timed out”),问题在网络层面,需要检查防火墙规则、网络策略或目标服务是否运行。

这种由底层向上的排查方法能快速缩小问题范围。


7. wget – HTTP/HTTPS 测试专家

wget 是一个功能完善的命令行下载工具,支持 HTTP、HTTPS、FTP 协议。与 curl 相比,wget 的语法更加简单直观,特别适合快速测试和下载任务。在容器调试中,wget 常用于测试 HTTP 端点可达性、验证 SSL/TLS 配置、下载配置文件等场景。

wget 的一个独特优势是 --spider 模式,它只检查目标是否存在而不实际下载内容。结合 -S 参数可以显示服务器返回的 HTTP 响应头,这对于验证服务状态、检查重定向、分析 HTTP 响应码非常有用。例如,wget --spider -S https://api.example.com/health 可以快速验证健康检查端点是否正常响应。

在处理 HTTPS 连接时,wget 提供了灵活的证书验证选项。默认情况下,wget 会验证服务器证书的有效性。如果遇到证书问题(如自签名证书、证书过期、域名不匹配),可以使用 --no-check-certificate 参数临时绕过验证,以便确定问题是证书相关还是网络相关。当然,这个参数只应在调试时使用,生产环境中应该确保证书配置正确。

wget 还支持设置各种 HTTP 头、超时时间、重试次数等参数,可以模拟各种客户端行为进行测试。-qO- 是一个常用的组合,表示安静模式(-q)并将内容输出到标准输出(-O-),适合在脚本中使用或快速查看响应内容。

试验指令:

# 检查 HTTP 端点状态(显示响应头)wget --spider -S http://api-server/health# 下载文件wget https://example.com/config.json# 忽略 SSL 证书错误(仅调试用)wget --no-check-certificate https://internal-api/# 设置超时时间(10 秒)wget --timeout=10 http://slow-api/# 将响应内容输出到标准输出wget -qO- http://api/health# 带自定义 Header 的请求wget --header="Authorization: Bearer token" http://api/# 显示详细的调试信息wget -v http://target-url/

效果截图:

典型场景:

当需要验证容器能否访问外部 HTTP 服务时,wget --spider -S https://target-api/ 是最快的方法。

从响应头中可以获取大量诊断信息:HTTP 状态码(200 正常、4xx 客户端错误、5xx 服务器错误)、重定向位置(Location 头)、服务器类型、内容类型等。

如果遇到 SSL 错误,先用 --no-check-certificate 绕过验证,确认是证书问题还是网络问题,然后再用 openssl 进一步诊断证书问题。

<第二部分完,请持续关注第三部分,谢谢>

参考资料

Connect to a container debug console in Azure Container Apps :  https://learn.microsoft.com/en-us/azure/container-apps/container-debug-console?tabs=bash#built-in-tools-in-the-debug-console


当在复杂的环境中面临问题,格物之道需:

浊而静之徐清,安以动之徐生。 

云中,恰是如此!


本站文章均为手工撰写未经允许谢绝转载:夜雨聆风 » 【Azure Container App】Debug Console的调试工具试验(二)– lsof/ util-linux / netcat / wget

猜你喜欢

  • 暂无文章

评论 抢沙发

9 + 6 =