点击图片报名参加广州&珠海源创会
如果您的应用程序不工作,或者您希望在寻找更多信息,这 20 个命令将派上用场。
在这个全新的工具和多样化的开发环境井喷的大环境下,任何开发者和工程师都有必要学习一些基本的系统管理命令。特定的命令和工具包可帮助开发者组织、排查故障并优化他们的应用程序,而且当出现错误时,也可以为运维人员和系统管理员提供有价值的分类信息。
无论你是新手开发者还是希望管理自己的应用程序,下面 20 条基本的系统管理命令都可以帮助您更好地了解您的应用程序。它们还可以帮助解决为什么应用程序可在本地正常工作但不能在远程主机上工作这类的系统故障。这些命令适用于 Linux 开发环境、容器和虚拟机。
curl 用于传输一个 URL。可以使用这条命令用于测试应用程序的端点或与上游服务端点的连接。curl 还可用于检查你的应用程序是否能连接到其他服务,例如数据库,或检查您的服务是否处于健康的状态。
举个例子,假如你的应用程序抛出一个 HTTP 500 错误,表示无法访问 MongoDB 数据库:
-I 选项用于显示头信息,-s 选项表示使用静默模式,不显示错误和进度。检查数据库的端点是否正确:
那么可能是什么问题呢? 检查您的应用程序是否可以访问数据库以外的其他位置:
看起来这没问题,现在尝试访问数据库。您的应用程序正在使用数据库的主机名,因此请先尝试:
这表示您的应用程序无法解析数据库,因为数据库的 URL 不可用或主机(容器或VM)没有可用于解析主机名的域名服务器。
2. python -m json.tool / jq
使用 curl 后,API 调用的输出可读性可能较差。有时候,你希望将生成的 JSON 数据格式化输出以查找特定的条目。Python 有一个内置的库可帮助您实现这个需求。可以使用 python -m json.tool 来缩进和组织 JSON。要使用 Python 的 JSON 模块,需要使用管道机制,将 JSON 文件的输出作为输入,写入到 python -m json.tool 命令行。
要使用 Python 库,使用 -m (module) 选项将输出内容和 Python 库组合成管道。
对于更高级的 JSON 解析,可以安装
jq
。jq 提供了一些从 JSON 输入中提取特定值的选项。要像上面的 Python 模块一样将 JSON 输出格式化,只需将 jq 应用到输出即可。
ls 用于列出目录中的文件,系统管理员和开发者会经常使用这个命令。在容器空间中,这条命令可以帮助确定容器镜像中的目录和文件。除了查找文件,ls 还可以用于检查权限。下面的示例中,由于权限问题,你不能运行 myapp。当你使用 ls -l 检查权限时,你会发现它的权限在 -rw-r--r-- 中没有"x",只有读写的权限。
tail 显示文件的最后一部分内容。通常情况下,你不需要浏览每行日志以进行故障排除。而是需要检查日志中对应用程序的最新请求的说明。例如,当你向 Apache HTTP 服务器发起请求时,可以使用 tail 来检查日志中发生的情况。
使用 tail -f 来跟踪日志文件并在发起请求时查看它们。
-f 选项表示跟随的意思,它可在日志被写入文件时输出它们。下面的示例具有每隔几秒访问端点的后台脚本,日志会记录请求。除了实时跟踪日志,还可以使用 tail 带上 -n 选项来查看文件的最后 100 行。
cat 主要用于查看文件内容和合并文件。你可能会使用 cat 来检查依赖项文件的内容,或确认已在本地构建的应用程序的版本。
上面的示例检查您的 Python Flask 应用程序是否已将 Flask 列为依赖项。
grep 能使用特定模式匹配(包括正则表达式)搜索文本。如果你在另一条命令的输出中寻找特定的模式,grep 会高亮显示相关的行。可使用这条命令来搜索日志文件以及特定的进程等。如果想查看 Apache Tomcat 是否启动,你可能会命令行的数量给淹没。但讲输出的内容和 grep 命令组合成管道,可以将表示服务器已启动的行独立出来。
ps 用于查看进程的各种状态信息。使用该命令可确定正在运行的应用程序或确认预期的进程。例如,如果要检查正在运行的 Tomcat Web 服务器,可使用带有选项的 ps 来获取 Tomcat 的进程 ID。
为了更好的易读性,可使用 grep 和 ps 组合成管道。
env 用于列出所有环境变量及为其赋值。在故障排除期间,你可能会发现需要检查是否有错误的环境变量来阻止应用程序启动。在下面的示例中,该命令用于检查程序主机上设置的环境变量。
请注意,该应用程序正在使用 Python 3,并具有连接到 MongoDB 数据库的环境变量。
top 用于显示系统中各个进程的信息和资源占用状况,类似于 Windows 的任务管理器。使用该命令可确定哪些进程正在运行,以及它们消耗了多少的内存和 CPU。一种常见的情况是当你运行一个应用程序时,它在一分钟后挂掉。这时,你首先检查应用程序的返回错误,发现是一个内存错误。
你的应用是否真的内存不足?要确认这个问题,可使用 top 来查看应用程序消耗多少 CPU 和内存。当使用 top 命令后,您注意到一个 Python 应用程序使用了大部分的 CPU,其内存使用量也迅速攀升。当它运行时,如果进程是你的应用程序,则按"C"键来查看完整命令并进行逆向工程。发现原来是你的内存密集型应用程序(memeater.py)。当你的应用程序已经用尽内存,系统会杀掉它并返回一个内存不足(OOM)的错误。
应用程序的内存和 CPU 使用量增加,最终因为内存不足而被杀掉。
通过按下"C"键,可以看到启动该应用程序的完整命令
除了检查应用程序,还可以使用 top 来调试其他使用 CPU 或内存的进程。
netstat 用于显示网络状态信息。该命令可显示正在使用的网络端口及其传入连接。但是,netstat 在 Linux 中不能开箱即用。如果需要安装它,需要在
net-tools
包中找到它。作为在本地进行试验或将应用程序推送到主机的开发者,可能会收到端口已被分配或地址已被使用的错误。使用 netstat 得到协议、进程和端口这些信息,下图表明 Apache HTTP 服务器已经在下面的主机上使用了 80 端口。
使用 netstat -tulpn 表明 Apache 已经在这台机器上使用了 80 端口。
如果 ip address 在你的主机上不能使用,必须使用
iproute2
包进行安装。ip address 用于显示应用程序的主机接口和 IP 地址。可使用 ip address 来验证你的容器或主机的 IP 地址。例如,当你的容器连接到两个网络时,ip address 可显示哪个接口连接到了哪个网络。对于简单的检查,可以随时使用 ip address 命令获取主机的 IP 地址。下面的示例展示了在接口 eth0 上的 Web 层容器的 IP 地址为 172.17.0.2
使用 ip address 显示 eth0 接口的 IP 地址为 172.17.0.2
lsof 用于列出当前系统打开的文件(list open files)。在某些 Linux 系统中,可能需要使用
lsof
包来安装lsof。在 Linux 中,几乎任何和系统的交互都被视为一个文件。因此,如果你的应用程序写入文件或代开网络连接,lsof 将会把这个交互映射为一个文件。与 netstat 类似,可使用 lsof 来检查侦听端口。例如,如果要检查 80 端口是否正在被使用,可使用 lsof 来检查哪个进程正在使用它。下面的示例中,可以看到 httpd (Apache) 在 80 端口上侦听。还可以使用 lsof 来检查 httpd 的进程ID,检查 Web 服务器的二进制文件所在位置(/usr/sbin/httpd)。