大家好,今天来为大家分享S给M的120条规矩的一些知识点,和20条系统管理员需要知道的命令的问题解析,大家要是都明白,那么可以忽略,如果不太清楚的话可以看看本篇文章,相信很大概率可以解决您的问题,接下来我们就一起来看看吧!
在这个全新的工具和多样化的开发环境井喷的大环境下,任何开发者和工程师都有必要学习一些基本的系统管理命令。特定的命令和工具包可帮助开发者组织、排查故障并优化他们的应用程序,而且当出现错误时,也可以为运维人员和系统管理员提供有价值的分类信息。
无论你是新手开发者还是希望管理自己的应用程序,下面20条基本的系统管理命令都可以帮助您更好地了解您的应用程序。它们还可以帮助解决为什么应用程序可在本地正常工作但不能在远程主机上工作这类的系统故障。这些命令适用于Linux开发环境、容器和虚拟机。
curl用于传输一个URL。可以使用这条命令用于测试应用程序的端点或与上游服务端点的连接。curl还可用于检查你的应用程序是否能连接到其他服务,例如数据库,或检查您的服务是否处于健康的状态。
举个例子,假如你的应用程序抛出一个HTTP500错误,表示无法访问MongoDB数据库:
$curl-I-smyapplication:5000nnHTTP/1.0500INTERNALSERVERERRORn
-I选项用于显示头信息,-s选项表示使用静默模式,不显示错误和进度。检查数据库的端点是否正确:
$curl-I-sdatabase:27017nnHTTP/1.0200OKn
那么可能是什么问题呢?检查您的应用程序是否可以访问数据库以外的其他位置:
$curl-I-shttps://opensource.comnnHTTP/1.1200OKn
看起来这没问题,现在尝试访问数据库。您的应用程序正在使用数据库的主机名,因此请先尝试:
$curldatabase:27017nncurl:(6)Couldn'tresolvehost'database'n
这表示您的应用程序无法解析数据库,因为数据库的URL不可用或主机(容器或VM)没有可用于解析主机名的域名服务器。
2.python-mjson.tool/jq
使用curl后,API调用的输出可读性可能较差。有时候,你希望将生成的JSON数据格式化输出以查找特定的条目。Python有一个内置的库可帮助您实现这个需求。可以使用python-mjson.tool来缩进和组织JSON。要使用Python的JSON模块,需要使用管道机制,将JSON文件的输出作为输入,写入到python-mjson.tool命令行。
$cattest.jsonn{"title":"Person","type":"object","properties":{"firstName":{"type":"string"},"lastName":{"type":"string"},"age":{"description":"Ageinyears","type":"integer","minimum":0}},"required":["firstName","lastName"]}n
要使用Python库,使用-m(module)选项将输出内容和Python库组合成管道。
$cattest.json|python-mjson.tooln{n"properties":{n"age":{n"description":"Ageinyears",n"minimum":0,n"type":"integer"n},n"firstName":{n"type":"string"n},n"lastName":{n"type":"string"n}n},n"required":[n"firstName",n"lastName"n],n"title":"Person",n"type":"object"n}n
对于更高级的JSON解析,可以安装jq。jq提供了一些从JSON输入中提取特定值的选项。要像上面的Python模块一样将JSON输出格式化,只需将jq应用到输出即可。
$cattest.json|jqn{n"title":"Person",n"type":"object",n"properties":{n"firstName":{n"type":"string"n},n"lastName":{n"type":"string"n},n"age":{n"description":"Ageinyears",n"type":"integer",n"minimum":0n}n},n"required":[n"firstName",n"lastName"n]n}
3.ls
ls用于列出目录中的文件,系统管理员和开发者会经常使用这个命令。在容器空间中,这条命令可以帮助确定容器镜像中的目录和文件。除了查找文件,ls还可以用于检查权限。下面的示例中,由于权限问题,你不能运行myapp。当你使用ls-l检查权限时,你会发现它的权限在-rw-r–r–中没有”x”,只有读写的权限。
$./myappnbash:./myapp:Permissiondeniedn$ls-lmyappn-rw-r--r--.1rootroot33Jul2118:36myappn
4.tail
tail显示文件的最后一部分内容。通常情况下,你不需要浏览每行日志以进行故障排除。而是需要检查日志中对应用程序的最新请求的说明。例如,当你向ApacheHTTP服务器发起请求时,可以使用tail来检查日志中发生的情况。
使用tail-f来跟踪日志文件并在发起请求时查看它们。
-f选项表示跟随的意思,它可在日志被写入文件时输出它们。下面的示例具有每隔几秒访问端点的后台脚本,日志会记录请求。除了实时跟踪日志,还可以使用tail带上-n选项来查看文件的最后100行。
$tail-n100/var/log/httpd/access_logn
5.cat
cat主要用于查看文件内容和合并文件。你可能会使用cat来检查依赖项文件的内容,或确认已在本地构建的应用程序的版本。
$catrequirements.txtnflasknflask_pymongon
上面的示例检查您的PythonFlask应用程序是否已将Flask列为依赖项。
grep能使用特定模式匹配(包括正则表达式)搜索文本。如果你在另一条命令的输出中寻找特定的模式,grep会高亮显示相关的行。可使用这条命令来搜索日志文件以及特定的进程等。如果想查看ApacheTomcat是否启动,你可能会命令行的数量给淹没。但讲输出的内容和grep命令组合成管道,可以将表示服务器已启动的行独立出来。
$cattomcat.log|greporg.apache.catalina.startup.Catalina.startn01-Jul-201718:03:47.542INFO[main]org.apache.catalina.startup.Catalina.startServerstartupin681msn
7.ps
ps用于查看进程的各种状态信息。使用该命令可确定正在运行的应用程序或确认预期的进程。例如,如果要检查正在运行的TomcatWeb服务器,可使用带有选项的ps来获取Tomcat的进程ID。
$ps-efnUIDPIDPPIDCSTIMETTYTIMECMDnroot10218:55?00:00:02/docker-java-home/jre/binroot590018:55pts/000:00:00/bin/shnroot7559018:57pts/000:00:00ps-efn
为了更好的易读性,可使用grep和ps组合成管道。
$ps-ef|greptomcatnroot10118:55?00:00:02/docker-java-home/jre/bin
8.env
env用于列出所有环境变量及为其赋值。在故障排除期间,你可能会发现需要检查是否有错误的环境变量来阻止应用程序启动。在下面的示例中,该命令用于检查程序主机上设置的环境变量。
$envnPYTHON_PIP_VERSION=9.0.1nHOME=/rootnDB_NAME=testnPATH=/usr/local/bin:/usr/local/sbinnLANG=C.UTF-8nPYTHON_VERSION=3.4.6nPWD=/nDB_URI=mongodb://database:27017/testn
请注意,该应用程序正在使用Python3,并具有连接到MongoDB数据库的环境变量。
top用于显示系统中各个进程的信息和资源占用状况,类似于Windows的任务管理器。使用该命令可确定哪些进程正在运行,以及它们消耗了多少的内存和CPU。一种常见的情况是当你运行一个应用程序时,它在一分钟后挂掉。这时,你首先检查应用程序的返回错误,发现是一个内存错误。
$tailmyapp.lognTraceback(mostrecentcalllast):nMemoryErrorn
你的应用是否真的内存不足?要确认这个问题,可使用top来查看应用程序消耗多少CPU和内存。当使用top命令后,您注意到一个Python应用程序使用了大部分的CPU,其内存使用量也迅速攀升。当它运行时,如果进程是你的应用程序,则按”C”键来查看完整命令并进行逆向工程。发现原来是你的内存密集型应用程序(memeater.py)。当你的应用程序已经用尽内存,系统会杀掉它并返回一个内存不足(OOM)的错误。
应用程序的内存和CPU使用量增加,最终因为内存不足而被杀掉。
通过按下”C”键,可以看到启动该应用程序的完整命令
除了检查应用程序,还可以使用top来调试其他使用CPU或内存的进程。
netstat用于显示网络状态信息。该命令可显示正在使用的网络端口及其传入连接。但是,netstat在Linux中不能开箱即用。如果需要安装它,需要在net-tools包中找到它。作为在本地进行试验或将应用程序推送到主机的开发者,可能会收到端口已被分配或地址已被使用的错误。使用netstat得到协议、进程和端口这些信息,下图表明ApacheHTTP服务器已经在下面的主机上使用了80端口。
使用netstat-tulpn表明Apache已经在这台机器上使用了80端口。
如果ipaddress在你的主机上不能使用,必须使用iproute2包进行安装。ipaddress用于显示应用程序的主机接口和IP地址。可使用ipaddress来验证你的容器或主机的IP地址。例如,当你的容器连接到两个网络时,ipaddress可显示哪个接口连接到了哪个网络。对于简单的检查,可以随时使用ipaddress命令获取主机的IP地址。下面的示例展示了在接口eth0上的Web层容器的IP地址为172.17.0.2
使用ipaddress显示eth0接口的IP地址为172.17.0.2
lsof用于列出当前系统打开的文件(listopenfiles)。在某些Linux系统中,可能需要使用lsof包来安装lsof。在Linux中,几乎任何和系统的交互都被视为一个文件。因此,如果你的应用程序写入文件或代开网络连接,lsof将会把这个交互映射为一个文件。与netstat类似,可使用lsof来检查侦听端口。例如,如果要检查80端口是否正在被使用,可使用lsof来检查哪个进程正在使用它。下面的示例中,可以看到httpd(Apache)在80端口上侦听。还可以使用lsof来检查httpd的进程ID,检查Web服务器的二进制文件所在位置(/usr/sbin/httpd)。
Lsof表明了httpd在80端口上侦听。检查httpd的进程ID还可以显示所有需要运行的文件httpd。
打开文件列表中的打开文件的名称有助于确定进程的来源,特别是Apache。
可以使用df显示空闲的磁盘空间(displayfreediskspace)以排查磁盘空间问题。挡在容器管理器上运行应用程序时,可能会收到一条错误信息,提示容器主机上缺少可用空间。虽然磁盘空间应该由系统管理程序来管理和优化,你仍可以使用df找出目录中的现有空间并确认是否没有空间。
Df显示每个文件系统的磁盘空间、绝对空间以及其可用性。
-h选项表示以可读性较高的方式来显示信息,上面的例子表示这个主机具有大量的磁盘空间。
du命令也是用于查看使用空间的,但是与df命令不同的是du命令是对文件和目录磁盘使用的空间的查看,要获取有关哪些文件在目录中使用磁盘空间的更多详细信息,可以使用du命令,和df命令还是有一些区别的。例如,你想了解那个日志文件占用/var/log目录最多的空间,可以使用du命令加上-h选项和用于获取总大小的-s选项。
$du-sh/var/log/*n1.8M/var/log/anacondan384K/var/log/auditn4.0K/var/log/boot.logn0/var/log/chronyn4.0K/var/log/cronn4.0K/var/log/maillogn64K/var/log/messagesn
上面的示例中显示了/var/log下的的最大目录为/var/log/audit。可以将du和df搭配使用,以确定在应用程序的主机上使用的磁盘空间。
要检查运行应用程序的用户,可使用id命令来返回用户身份。id命令可以显示真实有效的用户ID(UID)和组ID(GID)。下面的示例使用Vagrant来测试应用程序并隔离其开发环境。登录进Vagrant盒子后,如果尝试安装ApacheHTTPServer(依赖关系),系统会提示你需要以root身份执行该命令。要检查你的用户ID和组ID,使用id命令,会发现你正在”vagrant”组中以”vagrant”用户身份运行。
$yum-yinstallhttpdnLoadedplugins:fastestmirrornYouneedtoberoottoperformthiscommand.n$idnuid=1000(vagrant)gid=1000(vagrant)groups=1000(vagrant)context=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023n
要解决此问题,必须以超级用户的身份运行该命令,这将提供提升的权限。
chmod命令用来变更文件或目录的权限。当你在主机上首次运行应用程序的二进制文件时,可能会收到错误提示信息“拒绝访问”。如ls的示例所示,可以用于检查应用程序二进制文件的权限。
$ls-lntotal4n-rw-rw-r--.1vagrantvagrant34Jul1102:17test.shn
这表明您没有权限(没有“x”)来运行二进制文件。chmod可以修改权限,使的用户能够运行二进制文件。
$chmod+xtest.shn[vagrant@localhost~]$ls-lntotal4n-rwxrwxr-x.1vagrantvagrant34Jul1102:17test.shn
如例子所示,这将更新权限,使其具有可执行的权限。现在当你尝试执行二进制文件时,应用程序不会抛出拒绝访问的错误。当将二进制文件加载到容器时,Chmod可能很有用。它能保证容器具有合适的权限以执行二进制文件。
17.dig/nslookup
dig命令是常用的域名查询工具,可以用来测试域名系统工作是否正常。域名服务器(DNS)有助于将URL解析为一组应用程序服务器。然而,你会发现有些URL不能被解析,这会导致应用程序的连接问题。例如,假如你尝试从应用程序的主机访问你的数据库。你收到一个”不能解析”的错误。要进行故障排查,你尝试使用dig(DNS查询工具)或nslookup(查询Internet域名服务器)来确定应用程序似乎无法解析数据的原因。
$nslookupmydatabasenServer:10.0.2.3nAddress:10.0.2.3#53nn**servercan'tfindmydatabase:NXDOMAINn
使用nslookup显示无法解析mydatabase。尝试使用dig解决,但仍是相同的结果。
$digmydatabasenn;<<>>DiG9.9.4-RedHat-9.9.4-50.el7_3.1<<>>mydatabasen;;globaloptions:+cmdn;;connectiontimedout;noserverscouldbereachedn
这些错误可能是由许多不同的问题引起的。如果无法调试出根本原因,与系统管理员联系以进行更多的调查。对于本地测试,这些问题可能表示你的主机的域名服务器未正确配置。要使用这些命令,需要安装BINDUtilities包。
iptables用于阻止或允许Linux主机上的流量,用于IP包过滤器管理,类似于网络防火墙。此工具可阻止某些应用程序接收或发送请求。更具体地说,如果您的应用程序难以访问另一个端点,可能已被iptables拒绝流量访问该端点。例如,假设您的应用程序的主机无法访问Opensource.com,您使用curl来测试连接。
$curl-vvvopensource.comn*Abouttoconnect()toopensource.comport80(#0)n*Trying54.204.39.132...n*Connectiontimedoutn*Failedconnecttoopensource.com:80;Connectiontimedoutn*Closingconnection0ncurl:(7)Failedconnecttoopensource.com:80;Connectiontimedoutn
连接超时。您怀疑某些东西可能会阻塞流量,因此您使用-S选项显示iptables规则。
$iptables-Sn-PINPUTDROPn-PFORWARDDROPn-POUTPUTDROPn-AINPUT-ptcp-mtcp--dport22-jACCEPTn-AINPUT-ieth0-pudp-mudp--sport53-jACCEPTn-AOUTPUT-ptcp-mtcp--sport22-jACCEPTn-AOUTPUT-oeth0-pudp-mudp--dport53-jACCEPTn
前三个规则显示,默认情况下流量已被丢弃。剩下的规则表示允许SSH和DNS流量。在这种情况下,如果需要允许流量到外部端点的规则,请跟上sysadmin。如果这是用于本地开发或测试的主机,可使用iptables命令来允许合适的流量。添加允许到主机的流量的规则时一定要谨慎。
通常会在企业管理的应用程序主机上使用SELinux(一个Linux安全模块)。SELinux对主机上运行的进程提供最低权限的访问,防止潜在的恶意进程访问系统上的重要文件。某些情况下,应用程序需要访问特定文件,但可能会发生错误。要检查SELinux是否阻止了应用程序,使用tail和grep在/var/log/audit日志记录中查找”denied”(被拒绝)的信息。否则,使用sestatus来检查是否启动了SELinux。
$sestatusnSELinuxstatus:enablednSELinuxfsmount:/sys/fs/selinuxnSELinuxrootdirectory:/etc/selinuxnLoadedpolicyname:targetednCurrentmode:enforcingnModefromconfigfile:enforcingnPolicyMLSstatus:enablednPolicydeny_unknownstatus:allowednMaxkernelpolicyversion:28n
上面的输出表示应用程序的主机已启用SELinux。在本地开发环境中,可以更新SELinux使得权限更宽松。
当你使用大量的命令进行测试和调试时,可能会忘记有用的命令。每个shell都有一个history命令的变体。它可显示自会话开始以来使用的命令的历史记录。可以使用history来记录用来排除应用程序故障的命令。history命令用于显示指定数目的指令命令,读取历史命令文件中的目录到历史命令缓冲区和将历史命令缓冲区中的目录写入命令文件。
$historyn1clearn2df-hn3dun
如果希望执行之前历史记录中的命令,但又不想重新输入,该怎么办?使用符号!即可,可以使用符号!执行指定序号的历史命令。例如,要执行第2个历史命令,则输入!2,
在需要重新执行的命令的指定编号前添加!即可重新执行
这些基本命令能增强排查故障的专业技能,可检查为什么应用程序可以在一个开发环境中工作,而在另一个开发环境中则不可以。许多系统管理员使用这些命令来调试系统问题。了解一些有用的故障排查命令可帮助解决应用程序的问题。
原文来自:http://blog.jobbole.com/112085/
本文地址:https://www.linuxprobe.com/20-sa-command.html编辑:逄增宝,审核员:王毅
本文原创地址:https://www.linuxprobe.com/20-sa-command.html
文章到此结束,如果本次分享的S给M的120条规矩和20条系统管理员需要知道的命令的问题解决了您的问题,那么我们由衷的感到高兴!
还没有评论,来说两句吧...