在一个充斥着新工具和多样化开发环境的世界中,几乎所有开发人员或工程师都有必要学习一些基本的系统管理命令。特定的命令和软件包可以帮助开发人员组织、排除故障并优化其应用程序,并且在出现问题时为操作员和系统管理员提供有价值的分类信息。
无论你是新开发人员还是希望管理自己的应用程序,以下20个基本的sysadmin命令都可以帮助你更好地理解应用程序。它们还可以帮助你向系统管理员描述问题,并排除应用程序可能在本地工作而不在远程主机上工作的原因。这些命令适用于Linux开发环境、容器、虚拟机(VM)和裸机。
1. curl
curl调用一个URL。使用此命令测试应用程序的端点或与上游服务端点的连接。curl对于确定应用程序是否可以访问其他服务(如数据库)或检查服务是否正常非常有用。
例如,假设您的应用程序抛出HTTP 500错误,指示它无法访问MongoDB数据库:
$ curl -I -s myapplication:5000
HTTP/1.0 500 INTERNAL SERVER ERROR
-I 选项显示页面头信息(header),-s选项不显示页面body信息。从本地桌面检查数据库的终结点:
$ curl -I -s database:27017
HTTP/1.0 200 OK
那么问题出在哪里呢?检查应用程序是否可以从应用程序主机访问数据库以外的其他位置:
$ curl -I -s https://opensource.com
HTTP/1.1 200 OK
看起来没问题。现在尝试从应用程序主机访问数据库。你的应用程序正在使用数据库的主机名,请首先尝试:
$ curl database:27017
curl: (6) Couldn't resolve host 'database'
这表示应用程序无法解析数据库,因为数据库的URL不可用,或者主机(容器或VM)没有可用于解析主机名的名称服务器。
2. python -m json.tool / jq
了解了curl后,信息的输出可能比较很难读取。所以有时候你需要提高输出信息的可读性。Python有一个内置的JSON库,可以帮助实现这一点。您可以使用 python-m json.tool 缩进和组织json。要使用Python的JSON模块,将JSON文件的输出通过管道传输到python -m json.tool命令中。
$ cat test.json
{"title":"Person","type":"object","properties":{"firstName":{"type":"string"},"lastName":{"type":"string"},"age":{"description":"Age in years","type":"integer","minimum":0}},"required":["firstName","lastName"]}
要使用Python库,请使用-m(module)选项将输出通过管道传输到Python:
$ cat test.json | python -m json.tool
{
"properties": {
"age": {
"description": "Age in years",
"minimum": 0,
"type": "integer"
},
"firstName": {
"type": "string"
},
"lastName": {
"type": "string"
}
},
"required": [
"firstName",
"lastName"
],
"title": "Person",
"type": "object"
}
对于更高级的JSON解析,您可以安装jq。jq提供了一些从JSON输入中提取特定值的选项。要像上面的Python模块一样漂亮地打印,只需将jq应用于输出。
$ cat test.json | jq
{
"title": "Person",
"type": "object",
"properties": {
"firstName": {
"type": "string"
},
"lastName": {
"type": "string"
},
"age": {
"description": "Age in years",
"type": "integer",
"minimum": 0
}
},
"required": [
"firstName",
"lastName"
]
}
3. ls
ls列出目录中的文件。系统管理员和开发人员经常发出此命令。在容器空间中,此命令可以帮助确定容器映像的目录和文件。除了查找文件外,ls还可以帮助您检查权限。在下面的示例中,由于权限问题,您无法运行myapp。当您使用ls-l检查权限时,您会发现这些权限在-rw-r--r--中没有“x”,它们是只读和写的。
$ ./myapp
bash: ./myapp: Permission denied
$ ls -l myapp
-rw-r--r--. 1 root root 33 Jul 21 18:36 myapp
4. tail
tail显示文件的最后一部分。你通常不需要每个日志行来进行故障排除。相反,您希望检查日志中关于应用程序最近请求的内容。例如,当您向Apache HTTP服务器发出请求时,你可以使用tail检查日志中发生了什么。
$ tail -f /var/log/httpd/access.log
-f 选项表示“follow”,该选项在日志行写入文件时输出日志行。该示例有一个后台脚本,每隔几秒钟访问一次端点,日志记录请求。您也可以使用tail来查看文件的最后100行(使用-n选项),而不是实时跟踪日志。
$ tail -n 100 /var/log/httpd/access_log
5. cat
cat连接并打印文件。您可以发出cat来检查依赖项文件的内容,或者确认您已经在本地构建的应用程序的版本。
$ cat requirements.txt
flask
flask_pymongo
上面的示例检查Python Flask应用程序是否将Flask列为依赖项。
6. grep
grep搜索文件模式。如果要在另一个命令的输出中查找特定模式,grep将高亮显示相关行。使用此命令搜索日志文件、特定进程等。如果您想查看ApacheTomcat是否启动,那么您可能会被大量的行所淹没。通过将输出管道化到grep命令,可以隔离指示服务器启动的行。
$ cat tomcat.log | grep org.apache.catalina.startup.Catalina.start
01-Jul-2017 18:03:47.542 INFO [main] org.apache.catalina.startup.Catalina.start Server startup in 681 ms
7. ps
ps命令是procps-ng包的一部分,它提供用于调查进程ID的有用命令,显示正在运行的进程的状态。使用此命令确定正在运行的应用程序或确认预期进程。例如,如果要检查正在运行的Tomcat web服务器,可以使用ps及其选项来获取Tomcat的进程ID。
$ ps -ef
UID PID PPID C STIME TTY TIME CMD
root 1 0 2 18:55 ? 00:00:02 /docker-java-home/jre/bi
root 59 0 0 18:55 pts/0 00:00:00 /bin/sh
root 75 59 0 18:57 pts/0 00:00:00 ps -ef
为了更清晰,可以结合管道使用grep:
$ ps -ef | grep tomcat
root 1 0 1 18:55 ? 00:00:02 /docker-java-home/jre/bi
8. env
env允许您设置或打印环境变量。在故障排除过程中,您可能会发现它有助于检查错误的环境变量是否会阻止应用程序启动。在下面的示例中,此命令用于检查应用程序主机上设置的环境变量。
$ env
PYTHON_PIP_VERSION=9.0.1
HOME=/root
DB_NAME=test
PATH=/usr/local/bin:/usr/local/sbin
LANG=C.UTF-8
PYTHON_VERSION=3.4.6
PWD=/
DB_URI=mongodb://database:27017/test
请注意,应用程序正在使用Python,并且具有连接到MongoDB数据库的环境变量。
9. top
top显示并更新已排序的进程信息。使用此监视工具可以确定哪些进程正在运行,以及它们消耗了多少内存和CPU。当你运行一个应用程序并在一分钟后消亡时,会出现一种常见情况。首先,检查应用程序的返回错误,这是一个内存错误:
$ tail myapp.log
Traceback (most recent call last):
MemoryError
真的是应用程序内存不足吗?要确认,请使用top来确定应用程序消耗的CPU和内存量。在发布top时,您注意到一个Python应用程序使用了大部分CPU,内存使用率不断攀升,并怀疑它就是您的应用程序。当它运行时,点击“C”键可以看到完整的命令,如果进程是您的应用程序,则可以进行反向工程。它原来是内存密集型应用程序(memeater.py)。当您的应用程序内存不足时,系统将以内存不足(OOM)错误终止它。
应用程序的内存和CPU使用率增加,最终被杀死
通过点击“C”键,您可以看到启动应用程序的完整命令
除了检查您自己的应用程序外,您还可以使用top调试其他使用CPU或内存的进程。
10. netstat
netstat显示网络状态。此命令显示正在使用的网络端口及其传入连接。然而,netstat在Linux上并不是现成的。如果需要安装它,可以在net-tools包中找到它。作为在本地进行实验或将应用程序推送到主机的开发人员,您可能会收到一个错误,即端口已分配或地址已在使用。将netstat与协议、进程和端口选项一起使用表明,Apache HTTP服务器已经在下面的主机上使用了端口80。
使用netstat-tulpn表明Apache已经在这台机器上占用了端口80
本文作者:Rosemary Wang,翻译:GLIU
原文来自:www.opensource.com
黑白之道发布、转载的文章中所涉及的技术、思路和工具仅供以安全为目的的学习交流使用,任何人不得将其用于非法用途及盈利等目的,否则后果自行承担!
如侵权请私聊我们删文
END
多一个点在看多一条小鱼干