实战为上!深入解析20个运维命令
实战为上!深入解析20个运维命令
http://mp.weixin.qq.com/s?__biz=MjM5NTU2MTQwNA==&mid=2650652657&idx=1&sn=30d1fa71582eecbbe1417823e2c075f4&scene=1&srcid=0824gkjG29MCukC5Poclz7p7&from=groupmessage&isappinstalled=0#wechat_redirect
吴鹏冲,Linux大鹏博主,擅长技术写作。曾供职百度运维部七年,先后担任过运维负责人、运维平台开发组成员、监控产品经理三个角色。
直播实录实战为上!深入解析20个运维命令
按照惯例,我先做个自我介绍,让大家能够更了解我的经历和背景,如果哪位小伙伴和我有共同的经历或爱好,欢迎加我好友!
我在北邮计算机学院读了本科和硕士,毕业后便进入了百度运维部,一直工作了将近七年。
在百度期间,我做过OP,运维工程师;也做过RD,研发工程师,最后做了一年半的产品经理,负责百度内外部的监控系统。
去年年底,到今年年中,和两个小伙伴杨文强(CTO)、张昱(美国章鱼哥)写了《Linux大棚命令百篇》上下册,希望能让Linux工程师实现Linux命令的快速入门和进阶。
大家微信搜索并关注“Linux大棚”公众号后,就可以看到新书的介绍啦。
现在的我,在和一群小伙伴做一个创业项目,是关于“互联网+足球”的,希望能通过“技术”和“互联网思维”,让人们感受到足球的乐趣。
如果哪位小伙伴,既热爱技术,又喜爱足球,欢迎找我私聊哦。
另外,百度七年,我积累了一些经验、体会和感受,如果大家想了解,可以找我开小灶哈。
我能和大家分享的话题大概是这些:
- 互联网行业和互联网公司杂谈 - 运维行业的前景、运维工程师的职责和前途- 在百度运维部工作的体验 - PM/RD/OP/SYS各个角色的特点以及职业发展规划 - 技术岗位的职业瓶颈讨论 - 如何快速入门Linux - 运维系统和平台的知识,尤其是监控系统 - 如何坚持技术写作并不断进步 - 写书的整个过程和经验谈。
闲言少叙,我们今天就为大家带来一个非常非常实用的话题,那就是“深入解析最常用的20个Linux运维命令”。
由于时间有限,我们只有大概一堂课的时间,也就是45分钟,要讲20个高级命令,并非易事。我会略有侧重,一些命令会全面讲解,另一些命令则会只介绍最重要的使用场景。
如果大家希望在很短的时间内,快速深入最常用的Linux命令,可以购买我新出的书,不会让大家失望的。好,我们现在正式开始课程啦!
接触过计算机网络的同学一定都知道ping命令吧,当计算机联网出现问题时,第一个进入脑海的解决方法就是“ping一下网络呗”。
ping的最常用的用法,是这样的:
可以看出,我们使用了-c选项来指定ping的次数,参数指定为3,就表示ping三次。
如果你是处女座,不想看到每一次ping的过程,只想看到最后的统计结果,那有没有办法满足处女座这个小小的愿望呢?
当然有。只需简单地增加-q选项就行了,q就是quiet的首字母。
默认情况下,ping命令发送的两个数据包之间的间隔是 1 秒,如果我们嫌默认1秒发送一个 ping 包太慢,则可以使用 -i 选项来指定发送两个 ping 包之间的时间间隔。
不过需要注意的是,只有root用户才能设置低于0.2 秒的时间间隔哦。
在运维工作中,如果你想高强度地验证网络的可靠性,可以使用flood ping。
ping -f -c 1000000 10.70.10.250
如图所示,我们使用了-f 选项,即 flood ping,潮水模式的ping。
这里有一个知识点要注意,flood ping 会采用无间隔的方式尽全力发送探测数据包,确保每秒钟至少发送100 个。我们把这种模式形象地称为“疯狂模式”,注意,只有root账户才有疯狂的权力哦。
最后,我们给出在网络实际使用过程中的一些RTT参考值,希望对你排查网络问题能有一定的帮助。
对了,RTT,是指Round-Trip Time,往返时延。ping本机: 0.01ms ping同机房机器: 0.1ms ping同城机器: 1ms ping不同城机器: 20ms 北(南)方ping南(北)方机器: 50ms 从国内ping国外机器: 200ms
提醒大家:网络很复杂,情况很多变,上述数据仅供参考。
我们抓紧时间来为大家介绍一下第2个命令——nslookup 。
通过man nslookup ,我们可以看到nslookup的官方解释是“query Internet name servers interactively ”。
而nslookup是name server lookup的缩写,顾名思义,nslookup就是“用来查询DNS的” 。
由于nslookup命令涉及到DNS协议知识,所以,我们在书中提前讲解了DNS的相关知识,比如DNS的三种查询过程(递归、迭代、混合)等。
由于时间有限,我们就不在这里细致展开啦,相信大家对DNS协议应该都有一定程度的掌握。
假如你想知道www.baidu.com 对应的IP地址的话,那么用nslookup 应该是最正确的方法了。
可以看出,nslookup的输出包含了上下两部分。
1.上半部分:DNS服务器信息。 2. 下半部分:域名解析信息。
DNS 服务器信息中包含了两行内容,就是下面两行:Server: 223.5.5.5 Address: 223.5.5.5#53。
第一行的Server ,表示我们本次DNS解析所使用的DNS服务器名称; 第二行的Address ,表示我们连接到的DNS 服务器的具体IP地址和端口。
介绍完了nslookup输出中的上半部分,我们再来看看重头戏,nslookup输出中的下半部分,也就是“域名解析信息”:
Non-authoritative answer: www.baidu.com canonical name = www.a.shifen.com. Name: www.a.shifen.com Address: 61.135.169.121 Name: www.a.shifen.com Address: 61.135.169.125
首先,映入眼帘的便是“Non-authoritative answer”,如果你对DNS协议了解的比较全面的话,你应该知道,这表示返回的结果是非权威的。
而canonical name,就是我们常说的CNAME,也就是别名。所以我们可以看到,www.baidu.com 背后的别名是 www.a.shifen.com。
再下面的内容,则表示真正的解析结果,也就是www.baidu.com 所对应的两个IP地址。
其实,nslookup的能力远不止这些,我们还可以通过nslookup来查询某个域名的SOA、A记录、MX等,比如:
好了,我们已经把nslookup的最常用用法介绍完毕了,更多的知识有待大家自己来学习和研究。
好,我们进入第3个命令,即dig命令,不知道小伙伴们是否用过这个命令。
相比nslookup来说,dig命令算是比较冷门的命令,但是它真的非常有用,我们来一起看看。
dig,其实是一个缩写,即Domain Information Groper。
一些专业的DNS管理员在追查DNS问题时,都乐于使用dig命令。
最基本的dig用法是这样的:
从上面这个例子中,我们可以看到,dig命令的基本语法格式是这样子的:$ dig @dnsserver name querytype。
第一个参数,用来指定上联DNS服务器的地址 第二个参数,用来指定要查询的域名 第三个参数,则用来指定查询类型。
其实,dig就是这么简单。
dig非常著名的一个查询选项是 +trace,当使用这个查询选项后,dig 会从根域查询一直跟踪直到查询到最终结果,并将整个过程信息输出出来。
其他的选项可以忘记,但+trace这个选项可一定要记住,在追查DNS解析问题时,高手都会使用这个选项的。
大家可以在自己的Linux系统中体会一下,就像这个样子:dig +trace roclinux.cn
除了+trace之外, 还有+short选项也很实用,它可以让dig输出最精简的CNAME信息和A记录。
[roc@roclinux ~]$ dig +short www.baidu.com www.a.shifen.com. 112.80.248.74 112.80.248.73
在编写Shell脚本时,常常会用到+short选项的。
如果你的电脑上有Linux系统,那么直接输入man netstat ,就可以看到netstat的帮助信息了。
man对于netstat的解释非常言简意赅,只有一句简短地描述:“netstat – Print network connections, routing tables, interface statistics, masquerade connections, and multicast memberships”。
中文意思是:netstat可以用来显示网络连接、路由表、接口统计、无效连接和组播成员信息。
从这段简短的描述中,我们可以看出,netstat有五大作用: - 显示网络连接信息 - 显示路由信息 - 显示接口统计信息 - 显示无效连接信息 - 显示组播成员信息。
我相信,大家或多或少都用过netstat,但是,我要告诉大家一个不太好的消息,那就是netstat已经被淘汰了...
如果你仔细阅读man netstat的内容,就会发现这样一句话:
"This program is obsolete."
原来netstat 已经是明日黄花了,官方已经不再更新了。它已经被ss命令和ip命令所取代,或许在不久的将来,在Linux发行版中就见不到netstat的身影了。
所以,如果还有人在用netstat,建议赶快去学习ss和ip命令吧。
我为大家梳理了一张图,展示了netstat被淘汰后的替代方案:
下面,我们就赶紧进入ss命令。
ss是Socket Statistics的缩写。
顾名思义,ss命令可以用来获取socket统计信息,它可以显示和netstat类似的内 容。但ss的优势在于它能够显示更多更详细的有关网络连接状态的信息,而且比 netstat更快速、更高效。
netstat为什么会被淘汰呢?
当服务器的socket连接数量变得非常大时,无论是使用netstat命令还是直接读取/proc/net/tcp文件,执行速度都会非常慢。
当服务器维持的连接达到上万个的时候,使用netstat就等于浪费生命,而选用ss才是明智的选择。
天下武功唯快不破。ss快的秘诀在于,它利用到了TCP协议栈中的tcp_diag模块。
tcp_diag是一个用于分析统计的模块,可以获得Linux内核中的第一手信息,这就确保了ss的快捷高效。
为了让你更坚决地和netstat说再见,我们再列举一些测试数据,以证明ss的快速绝非浪得虚名。
假如服务器维持着3万个socket连接,而此时系统管理员需要计算当前服务器的总连接数,则可以使用下面3种方法,不同方法的耗时有着明显差异:netstat -at | wc 耗时 15.60 秒 ss -atr | wc 耗时 5.40 秒(未利用tcp_diag) ss -atr | wc耗时 0.47 秒(利用tcp_diag)。
可以看到,利用了tcp_diag模块特性的ss命令,真的是飞一般的感觉。
下面,我就为大家介绍几个ss的最常用方法:
场景一:我想查看当前服务器的网络连接统计 $ ss –s
场景二:我想查看所有打开的网络端口 $ ss –l
场景三:我想查看这台服务器上所有的socket连接 # ss –a
我们接下来的是ip,它既不是IP地址,也不是知识产权,而是Linux系统iproute2软件包中的ip命令,一个用来管理网络设备和路由的强大命令。
假如我想展示一台服务器的网络接口信息,那就这样: `# ip addr show;
而为网络接口添加一个IP 地址,方法是这样的:# ip addr add 192.168.1.111/24 dev p1p2;
针对一个网络接口删除其IP 地址,这样:ip addr del 192.168.1.111/24 dev p1p2;
禁止和激活网卡接口,也很简单: ip link set p1p2 down ip link set p1p2 up;
查看路由表的方法是: ip route show;
可以看到,ip命令是一个纯粹的管理类命令,我回头会整理一张关于ip的速查表,分享在”Linux大棚“公众号和微博中,便于大家查阅。
tcpdump就好像一个神探,它有着夜视的绝技,在毫无光亮的环境中,仍然可以看到所有的东西。
我们可以用通俗、形象、学术的表达方式来全方位地描述tcpdump :
通俗地说,tcpdump是一个抓包工具,用于抓取互联网上传输的数据包。
形象地说,tcpdump就好比是国家海关,驻扎在出入境的咽喉要道,凡是 要入境和出境的集装箱,海关人员总要打开箱子,看看里面都装了些啥。
学术地说,tcpdump是一种嗅探器(sniffer ),利用以太网的特性,通过 将网卡适配器(NIC )置于混杂模式(promiscuous )来获取传输在网络中 的信息包。
开门见山,我们开始抓人生中的第一个包:
[root@roclinux ~]# tcpdump -i eth0 -nn -X 'port 53' –c1。
我们来一起解读上面这条命令:
-i 选项:即interface,用来指定网络接口,也就是要告诉tcpdump希望它去监听哪一块网卡,这在我们的服务器有多块网卡时是很有必要的。
-nn选项:意思是当tcpdump遇到协议号或端口号时,不要将这些数字转换成对应的协议名称或端口名称。比如,众所周知21号端口是FTP端口,我们希望显示“ 21”,而非“ FTP”。
-X选项:告诉tcpdump命令,需要把协议头和包内容都原原本本地显示出来。 tcpdump会同时以16进制和ASCII的形式显示,这在进行协议分析时是绝对的利器。
port 53:这是告诉 tcpdump 要有选择地展示所抓到的包。本例中,我们只关心源端口或目的端口是53的数据包,其他的数据包就不要再显示出来了。
-c 选项:是Count的含义,这个选项用来设置我们希望 tcpdump 帮我们抓几个包。我设置的是1,所以tcpdump只会抓一个包就收手,不会帮我再多抓哪怕一个包。
好了,大家都已经学会抓包了,而在实际运维工作中,我们需要将抓到的包保存起来,然后再对抓到的包逐一进行分析。
所以,我们就要掌握“如何保存”和“如何读取”网络数据包的技能。下面,我们就来一起学习。
做过网络流量分析的同学,或许都有一个共同的需求,那就是都要做“流量保存”和“流量回放”,这就恰好对应到了的-w选项和-r选项。
流量保存就是把抓到的网络包存储到磁盘上,保存下来,为以后使用。
流量回放就是把历史上的某一时间段的流量,重新模拟回放出来,用于流量分析。-w选项:将流量保存到文件中:
通过上面的例子可以看到,通过-w 选项将流量都存储在了flowdata文件中了。
如果大家用less命令查看flowdata这个文件的话,会发现全是乱码。
原来,tcpdump的-w方式是把 raw packets(原始网络包)直接存储到文件中的,也就是 存储的都是结构体数据,而非我们在屏幕上所看到的文本格式的数据,因此大家是无法直接通过less命令查看的。
那怎么查看呢?大家想必也想到了,那就是用-r选项。
其实上面的命令就是在不知不觉中进行了“流量回放”,你会发现曾经被抓的网络包,都按照历史顺序进行了回放,是不是有种坐上了“时光机”的感觉。
前面我们都是围绕tcpdump 的选项来介绍的,下面,我们会把目光转向“过滤表达式”,让大家能够在抓包过程中“去其糟粕,取其精华”。
如果你希望自己研究“过滤表达式”,没问题,我会告诉你如何“入门”,方法就是: man pcap-filter。
你会发现,过滤表达式大体可以分成三种过滤条件,“类型”、“方向”和“协议”,这三种条件的搭配组合就构成了我们的过滤表达式。
我们来看实战:
我只想抓UDP的包,不想被TCP的包打扰 [root@roclinux ~]# tcpdump -i eth0 -c 10 'udp';
举这个例子,是为了说明tcpdump具有根据网络包的协议类型来进行过滤的能力, 我们还可以把udp改为ether 、ip 、ip6 、arp 、tcp 或rarp 等。
我想专门查看这个源机器和那个目的机器之间的网络包,不想被其他无关的网络包所打扰,该怎么做呢?
这个其实很简单,也很直观,只要设置src(source)和dst(destination)就好了。 而且很方便的是,tcpdump还支持使用and和or来进行搭配组合呢!
[root@roclinux ~]# tcpdump -i eth0 'dst 8.8.8.8'。
只想看到目的端口是53或80的网络包,其他端口的我不关注。
[root@roclinux ~]# tcpdump -i eth0 -c 3 'dst port 53 or dst port 80'。
看,我们这里用到了or这个关系符。
我们可以设置过滤类型,上面例子中我们使用了port这个类型,就是来指定端口 的。当然,tcpdump还支持如下类型:
- host:指定主机名或 IP 地址,例如‘host roclinux.cn’或‘host 202.112.18.34’。
- net:指定网络段,例如 src net 128.3’或‘ dst net 128.3’。
- portrange:指定端口区域,例如‘ src or dst portrange 6000-6008’。
如果我们没有设置过滤类型,那么默认是host 。
好了,我们在这几分钟里,为大家介绍了tcpdump的抓包、存包、读包、过滤包的各种实战方法,相信大家已经掌握了。
而如何解读包中的内容,大家可以通过阅读我书中的相应篇章来深入学习。
命令nc,全名netcat ,中文叫作“网猫” ,nc的man中提到:The nc (or netcat) utility is used for just about anything under the sun involving TCP or UDP.
这句话翻译成中文就是:“nc工具能胜任全天下的跟TCP/UDP相关的一切操作。”
nc确实很能干,它可以打开TCP 链接、发送UDP 包、监听TCP/UDP 端口、进行端口扫描,是网 络世界里的一只既可爱又靠谱的网猫。
nc最常用的用法就是端口扫描,用nc可以很方便的看到哪些端口处于监听状态。
我们来实际实施一次端口扫描:
上面命令扫描本地20-23端口,发现22端口能够连接成功,也就是22号端口此时处于开放状态。下面解释该命令涉及的几个选项:
-z 选项:一旦建立连接后马上断开,而不发送和接收任何数据。 -v 选项:打印详细输出信息。 -n 选项:直接使用IP 地址,而不使用域名服务器来查询其域名。 -w 选项:设置连接的超时时间,单位为秒。 -u 选项:使用UDP 建立连接。上面命令无此设置,则表示使用TCP 建立连接。
其实,nc还有一个实战时的用法,那就是传输文件。 只需选择一个端口就可以在两台机器之 间进行文件传输,而不需要进行任何配置,即不像ftp和scp在登录阶段还需要验证用户名、密码这样的安全信息。
我们来看一个实战例子:
在服务器端,也就是文件的发送端,我们启动监听端口,准备好文件,等待客户端来接收: [roc@roclinux ~]$ nc -v -l 12345 < book_out.txt。
在客户端,也就是文件的接收端,会使用如下命令来接收服务器端的数据,并重定向到文件中:
此时,再回到服务器端,可以看到这样的信息输出:
这说明客户端已经来取数据了。一旦数据传输完毕,连接会自动断开。
看完这个例子,我再给大家举一个逆向思维的例子。
服务器端,也就是使用-l选项进行端口监听的一端,不一定非要是文件的发送端, 完全可以反过来作为文件的接收端。
[roc@roclinux ~]$ nc -v -l 12345 > book_in.txt。
此时的客户端,则充当文件发送端的角色。
[root@roclinux ~]# nc -n 116.255.245.207 12345 < book_out.txt。
瞬间剧情反转了,是不是很有意思呢?
好了,nc的用法,我们就先讲到这里,其实nc还有很多可以把玩的功能,大家可以继续深入研究。
说到“同步”,不得不提的是我们的同步利器rsync,接下来就来说说我从这个工具中体会到的同步的艺术。
我们经常这样使用rsync : [userA@machineA ~]$ rsync main.c machineB:/home/userB。
下面我会介绍rsync的5条规则,大家一条一条来看:
- 只要目的端( machineB)的文件内容和源端( machineA)不一样,就会触 发数据同步, rsync 会确保目的端的文件保持和源端一致。
- 但 rsync不会同步文件的“ modified time”,凡是有数据同步的文件,目的 端文件的“modified time”总是会被修改为最新时刻的时间。
- rsync 不太关注目的端文件的 rwx 权限。如果目的端没有此文件,那么权 限会保持与源端一致。如果目的端有此文件,则权限不会随着源端变更。
- 只要 rsync 有对源文件的读权限,且对目标路径有写权限,rsync 就能确保 目的端文件同步到和源端一致。
- rsync 只能以登录目的端的账号来创建文件,它没有能力保持目的端文件的 属主和属组和源端一致。(除非你使用root权限,才有资格要求属主一致、属组一致)
那,有同学会问了,如果我就是想同步修改时间,该怎么办呢?
-t 选项让修改时间也同步。
[userA@machineA ~]$ rsync -t main.c machineB:/home/userB。
1.使用-t选项后,rsync总会想着一件事,那就是将源文件的“ modified time” 同步到目标机器。
2.带有-t选项的rsync,会变得更“聪明”,它会在同步前先对比两边文件的 时间戳和文件大小。如果时间戳和文件大小都完全一致,那么就认定两边 文件是一样的,于是,对这个文件就不会发起同步动作了。
3.因为rsync 的“聪明”,所以也会反被聪明误。如果目的端的文件的时间 戳、大小和源端完全一致,但是内容恰巧不一致时,rsync 就发现不了了。 这就是传说中的“坑”。
我们在第一次使用rsync时,往往会遇到这样的囧境: [userA@machineA ~]$ rsync mydir machineB:/home/userB skipping directory mydir。
如果你不额外告诉rsync你需要它帮你同步文件夹的话,它是不会主动承担的,这 也正是rsync的懒惰之处。
所以,如果你真的想同步文件夹,那么一定要加上-r 选项,即recursive (递归的、循环的),像这样: [userA@machineA ~]$ rsync -r mydir machineB:/home/userB。
在运维工作中,使用软链接文件,是常有的事儿。
如果我们要同步一个软链接文件,猜猜rsync会提示什么?
眼见为实,rsync又无情地拒绝了我们。它一旦发现某个文件是软链接,就会无视它。
那么,解决方法是什么呢?
我们需要增加-l选项(字母L 的小写)。 [userA@machineA ~]$ rsync -l softlink machineB:/home/userB
使用了-l选项后,rsync会完全保持软链接文件类型,原原本本地将软链接文件复 制到目的端,而不会“follow link ”到指向的实体文件。
如果你偏偏就是想让rsync 采取follow link的方式,那就用-L选项就可以了。大伙可以自己试试效果。
rsync其实是一个非常复杂的命令,它有非常多的选项,也有不少“坑儿”。
曾经我的同事就出现过使用rsync把远端的数据同步丢了的情况。
所以,在用这个命令前,大伙一定要多多测试。
能和rsync比复杂的,当属wget,这个命令的破坏力不如rsync,但是选项也是足够的多。
wget 用英语来描述就是 the non-interactive network downloader,中文称之为非交互 的网络下载器。
wget支持HTTP、 HTTPS 和 FTP 协议的下载,其中也包括通过HTTP代理的下载。 看起来好像支持的协议并不多,但其实这已经足够了,通常我们是很少使用除这 些协议之外的其他协议来进行下载的。
我们还是按照惯例,把wget 的最简单用法先介绍给大家。
首先试着用wget 工具来下载一张 图片: [roc@roclinux ~]$ wget http://www.yunweibang.com/yunweibang.jpg
wget用起来看着很简单的吧!
其实不然,我们来说说wget的一个潜规则。
提到潜规则,我们先来说一下有关配置文件的潜规则吧。
当你使用wget时,请务必查看/etc/wgetrc 文件和家目录下的.wgetrc文件,先搞清楚里面都设置了什么,再来使用wget命令不迟。
因为这两个文件会配置wget的一些默认行为,这对大家使用wget可能会有比较大的影响。
举一个实际的例子,你就会有所体会啦。
wget命令有一些选项可以接受用逗号隔开的参数,比如 -X(大写的 x)选项,它用来设定“不希望下载”的目录列表。
你可以用逗号把不希望下载的目录一个一个列出来,比如“ wget -X wukong,bajie”,这样 wget 心里就有数了,它知道wukong目录和bajie目录都是不用下载的。
如果这些目录是你长期不希望下载的,那么你完全可以在.wgetrc文件中设置“长期不希望下载”的目录列表,格式是这样的:exclude_directories=wukong,bajie
于是,你不必在wget命令上设置,就可以实现“不下载”wukong和bajie目录。
当然,如果某天你下载文件时,发现总有几个目录下载不下来,那么你应该想到,有可能是其他人设置了.wgetrc 造成的。当然你还要再去/etc/wgetrc 文件中确认一下你的假设。
还有一个小技巧,也可以避免这种误会(别人设置了exclude_directories ,而你却不知道),那就是在你使用wget时,这样来写: wget -r -X '' -X wukong,bajie ftp://localhost
使用-X''的目的就是去除.wgetrc和/etc/wgetrc的作用,然后再用-X wukong ,bajie设置,就可以踏踏实实地保证不下载wukong和bajie目录,而其他目录绝不会受影响。
接下来,我们来重点介绍下wget下载目录的一些技巧,因为对于初学的同学来说,目录下载估计会是大家的噩梦。
-r选项就是用于下载远程的文件夹的,但是情况并没有想象得那么简单,对于ftp服务来讲,假如你使用了下面的命令来下载文件夹的话: [roc@roclinux ~]$ wget -r ftp://my.test.server:/home/roc/img
那么,实际在当前目录下会生成my.test.server/home/roc/img这样的多层级目录结 构,可见直接使用-r选项,默认会创建“ 域名和绝对路径”组成的目录结构。
虽然我们将数据成功下载到本地了,但这或许并不是我们的初衷,至于更优雅的解决办 法,我们需要-nH来帮忙。 -nH 选项,即 --no-host-directories
通过上例我们已经知道了在使用wget –r命令下载目录时,默认会创建以域名my.test.server命名的文件夹。而使用-nH选项后就可以避免这种默认行为。
所以,当你用如下命令下载文件时,只会在当前目录下创建home/roc/img目录结构,而原来的my.test.server文件夹已经不见了。 $ wget -r -nH ftp://my.test.server:/home/roc/img
域名去掉了,但长长的目录路径仍然还在,如果我只想下载img单个文件夹,不希望掺杂着前面的路径,该怎么做呢?
我们还需要--cut-dirs来帮忙。
这个选项很常用,它表示下载数据时,在本地创建目录时,忽略前面多少层的目 录结构。
我们来看一个表格,相信大家就豁然开朗了:
从表中大家应该知道-nH和--cut-dirs两个选项互相配合的效果了吧。
好了,wget我们就先讲到这里,这个命令涉及到的选项和知识有很多,即使花一堂课的时间来讲解也不足够。
在《Linux大棚命令百篇》中,我们写了一个小的系列文章,总共4篇,来讲解wget命令,有志于深入wget的同学,可以阅读这个系列文章,来更全面的掌握wget命令哈。
我们的内容已经过半了,为了节省时间,后面的命令,我们更多的是介绍最基本用法和1-2个实战难点。
想必大家也有些疲惫了,我们先来介绍一个轻松简单的命令吧,那就是uptime。
uptime命令,有两大功能:一个是查看机器的开机时长,另一个是查看CPU负载情况。
下面来看看uptime命令的实际运行效果:
其含义解释,我绘制了一个表格:
这时,或许会有同学问了,什么是系统平均负载
学术的说,系统平均负载,是指在特定时间间隔内运行队列中的平均进程数。
首先讨论单核CPU情况下的系统平均负载。我们尝试用“坐大巴”的场景,来说明这个事情。
一个单核CPU可以形象地比喻成一辆大巴车。
一般来说,大巴车的载客数是一定的,比如30人。当大巴车载客营业时,如果载客20人的话,这时乘客会感觉车内很宽松;当载客30人的话,这时刚刚好,每一个人都有座位坐,但已经让人感觉拥挤了。当继续有乘客上车的话,就会有人站在车的过道上,让人感觉车内拥挤不堪。
那如何体现车的拥挤程度呢? 这就要用到平均负载这个量化指标了。
0.00表示车内一个人都没有,这时车是空载。 1.00表示车内乘客每个人都有座位坐,这时车是满载。
如果大家理解了单核CPU的系统平均负载,那么理解多核CPU的系统平均负载就会容易得多。
多核CPU,就好像我们有多辆大巴车,承载能力和运力都成比例增加。我们设服务器具有N个CPU 核,那么负载值如果小于N,则认为服务器仍然在可承受范围内,否则,就是过载状态啦。
free命令,是一个看似简单,但其实有很多学问的命令。
最最常用的用法,当然就是直接输入free啦,输出内容则以KB为单位:
如果想让数字更可读,大家往往会加上-m选项,让输出内容以MB为单位展示:
从free的输出内容中,可以看出,这台服务器拥有3GB内存容量,对于一台入门 级服务器来说,已经不算小了。
有些同学比较喜欢使用-g选项,让输出内容以GB为单位显示。这样虽然可以增 加可读性,但却存在不小的隐患:
首先,-g选项并非是官方支持的选项,你会发现在 man free 时是看不到这 个选项的,所以不确认在所有的free版本中都支持。
最重要的是,-g选项会采用向下取整的方式显示内存容量,就如本文给出 的例子,原本3031MB内存容量,换算后变为2.96GB,最后会显示成2GB, 这会在很大程度上误导用户。
就像下面这样,本来服务器的内存总量是3GB,但是这里却显示成了2GB,是不 是很坑人呢?
阅读free命令的输出,也是一门学问,我遇到过太多的小伙伴,并不理解free命令输出的指标的含义,为此,我画了一张示意图,希望能让大家对free的输出一目了然。
建议大家收藏这张图,甚至可以打印出来,放在办公桌前。
好了,后面还有8个命令要介绍,关于free命令的更细节,以后有机会再给大家细致介绍。
vmstat这个命令真的非常实用,相信所有从事Linux相关工作的同学都使用过它。
vmstat,是一个Linux的性能监控工具,是Virtual Memory Statistics的缩写。从这 个细节可以看出,这个命令最初只是被设计用来展示虚拟内存状态的,后来随着 不断地迭代和扩展,现在变成了一个强大的性能监控工具。
vmstat,最初是在1994年被开发出来的,其作者是美国扬斯敦州立大学的 Henry Ware。貌似Linux的牛人都很低调,网上没有找到他更多的资料。
vmstat的最常用用法
vmstat最常用的方法是:
$ vmstat 输出间隔秒数 输出次数
从上面的例子可以看出,我们希望vmstat每隔1秒输出一次系统状态信息,共输 出4次。
和free命令类似,我也为大家准备了一张速查图,让大家可以更快的掌握vmstat命令:
mpstat,全称是 ultiprocessor statistics,正如它的名字一样,它所擅长的技能正是 多处理器的统计工作。
让我们来看看它的常见用法: [roc@roclinux splan]$ mpstat -P ALL 1
有兴趣的同学,可以自己执行以下这个命令,看看输出的内容。
发现了么,我们使用了-P ALL这样的选项和参数,其作用是展示出每一个CPU核 的运行状态。
我们的这台服务器总共有4个CPU核,mpstat清晰地展示出了综合状态,以及每 一个CPU核的运行状态。
而命令中最后的参数1,则表示要求mpstat每隔1秒钟,产出一组新的状态数据。 如果你使用过vmstat的话,你会很熟悉这种用法。
如果我们只想关注第1个CPU核(编号为0)的话,应该怎么办呢?其实很简单, 只需要把ALL改成0,就可以了。
如果说vmstat还有些同学不知道的话,那么top命令应该是大家最耳熟能详的 Linux命令之一了吧。
下面我们就来和大家聊聊top这个命令。节省时间,我们直接进入正题。
top命令,是非常常用的Linux 性能监控工具,运行时,它会独占屏幕,并周期性 地更新,让工程师们可以快速了解服务器的运行状态。
通过top ,我们可以了解到服务器的CPU 负载情况、内存状态、SWAP 使用状况, 以及详尽的进程级运行状态,可谓应有尽有。
我们最常使用的场景,大概有以下几个: - 找到是哪些淘气的进程在大量消耗CPU 资源。 - 看看哪些进程消耗了宝贵的内存空间。 - 看看哪些进程占用的CPU时间最多。
一图胜千言,我们还是通过速查图,来介绍top吧:
这就是top命令输出后的样子,分成系统级信息和进程级信息。
在书中,我们针对top有五个篇章:
(1)top 命令庖丁解牛之一——入门 (2)top 命令庖丁解牛之二——列管理 (3)top 命令庖丁解牛之三——进程数据 (4)top 命令庖丁解牛之四——排序大法 (5)top 命令庖丁解牛之五——CPU 和内存
有兴趣的同学可以去细细探究!
iostat,用来显示 CPU 的统计信息以及整个系统、适配器、tty设备和硬盘的输入/输出信息。
首先,我们来看看iostat执行起来的样子:
可以看到,iostat的输出信息主要分为三大部分。
第一部分:系统信息。包括了系统名称、内核版本信息以及架构信息等。 第二部分:CPU信息阅读过前面top系列文章的同学,相信对这几个指标项并不陌生。 第三部分:磁盘信息。这里展示出了本台服务器上各个存储设备的I/O情况,包括块的读写量和读写速度等。
当我们怀疑磁盘出现性能问题时,通常需要查看磁盘的各种信息。磁盘的工作状 态如何?TPS 是多少?吞吐量有没有问题?我们需要通过命令把这些信息展示出 来:
上面的命令显示了磁盘读写数据的情况,命令中的选项和参数有必要和大家解释 一下:
-d选项:表示只显示磁盘的使用状态,指定该选项后,iostat 将只显示磁 盘信息而不再显示 CPU 信息。
-k选项:表示使用统KB作为单位,比如 kB_read/s列的8.37表示的就 是 8.37KB/s。
“1 ”参数:表示采样时间,本例为1 秒。 “3 ”参数:表示采样次数,本例为3 次。
这几个选项,应该算是使用最频繁的选项啦。至于iostat中的各个指标的具体含义,大家可以自己去探究。
下面为大家介绍一位新朋友,它的名字叫作sar,它的脑子里装满了服务器系统性能的信息。你只要和它搞好关系,以后想获得任何这方面的信息,就都不用发愁了!
我们来看一下sar命令运行的样子:
其中,sar 2 3表示每2秒输出一次信息,共输出3次实时信息,再外加一行汇总的 平均值,总共是4行信息。
sar命令支持多核CPU么
哈哈,完全没问题的,sar命令拥有一个-P选项(大写字母P ),就是专门用来展示 多核处理器性能指标的。
当使用sar命令而没有设定-P选项时,sar会根据所有的CPU核信息给出一个汇总 报告。
当使用-P ALL时,sar命令就会针对每一个CPU核都给出其具体性能信息,然后 再给出一个总的性能信息。
比如,我这里有一个至强处理器的CPU,是八核的,看看-P选项的威力吧。
看到了吧,sar命令把每一个CPU核都编上了号(从0到7),并且依次展示了它 们的各个性能指标。
除了cpu外,我还喜欢用sar来查看网络流量,用法是这样的:
如果使用EDEV关键字,那么sar命令会针对网络设备汇报其失败情况,例如:
好了,已经为大家介绍了sar的最常用的几种用法啦,大家可以在自己的Linux服务器上使用起来了!
这次的主角,不是那款大名鼎鼎的图像设计软件Photoshop,而是Linux系统中的 进程状态查看命令ps,即Process Status 。
如果你想查看你的服务器上有哪些进程,这些进程属于哪些用户,这些进程消耗 了多少CPU资源,这些进程占据了多少内存资源,那么就快来一起学习ps命令吧。
下面我们就从实战出发,来学习ps的最常用用法。
ps aux便是我们最常用的ps用法了。它可以展示出系统中所有进程的状态 信息,非常便于管理员进行全局查看。
那么,aux到底代表什么含义呢? a:显示各终端上的所有进程。 u:会展示进程所属用户名。 x:对于没有关联到终端上的进程,也展示出来。
现在,我们给出ps命令输出列的解释,便于大家阅读和理解
至于ps如何以树状结构查看进程、如何控制输出列、如何查看线程等技巧,可以通过读书来学习。
lsof,即list open files,可以用来查看进程打开的文件、目录和套接字等一系列信息。
lsof 是Linux系统管理员经常使用的工具之一,建议大家使用root账户运行该命令, 不然的话,可能会有不少信息无法显示出来。
lsof可以通过文件名来定位打开该文件的进程,方法是执行lsof filename,这样,就可以找到到底是谁在打开这个文件啦。
既然可以通过文件名定位进程,那么同理,文件描述符也应该是可以的才对。比 如我们想找出所有打开标准错误输出的进程: [root@roclinux ~]# lsof -d 3
工作中,还经常有这样的需求,那就是通过PID 查找打开的文件。 [roc@roclinux ~]$ sudo lsof -p 5619
如果想查找用户getsmartoffer在系统中都打开了哪些文件,我们可以使用-u选项来实现: [roc@roclinux ~]# sudo lsof -u getsmartoffer
除了查找文件之外,lsof还可以查看程序占用着哪些端口: [root@roclinux ~]# lsof -i:22
上面的例子,可以查看端口22上都运行着哪些程序。
在书中,我们为大家准备了三个运维悬案,都是靠lsof来解决的: (1)文件删除,但磁盘空间没有释放 (2)磁盘增长,但找不到幕后黑手 (3)端口被无故占用
大家如果有兴趣,可以继续进阶阅读。
lsof的强大功能,无论是在文件方面、网络方面,还是在侦查悬案方面,它的表现都超出了大家的预期。
但是比较遗憾的是,lsof命令并不是POSIX标准中规定的命令,所以如果深究的话,lsof命令在可移植性方面会稍微差一些。而经常拿来与lsof命令作比较的fuser命令,则属于POSIX标准的命令集。
所以我们在本讲座的最后一篇文章中,和大家介绍一下fuser命令。
可能有人会问“POSIX”是什么,我们就在这里小科普一下。
POSIX,是Portable Operating System Interface的缩写,中文称为可移植操作系统接口。它是一种有关操作系统的行业标准。 POSIX标准的职责是确保程序在源代码级别上的可移植性。
通俗地说,只要在程序开发过程中使用的是POSIX标准规定的API和命令,那么这个程序就应该可以在任何其他符合POSIX标准的操作系统上编译和执行。
科普之后,大家应该能够理解lsof和fuser在可移植性方面的区别了吧!
fuser命令在功能上和lsof命令有很多相似之处,它可以显示出磁盘上的文件、目 录,甚至网络端口正在被什么程序使用,并可以展示出这些程序的详细信息。
我们先来看一个示例。
[root@roclinux ~]# fuser -v /home/roc
上述命令列出了所有正在打开/home/roc/这个目录(不含目录下的文件)的进程。
这和lsof功能是类似的,在端口方面,fuser也可以实现类似lsof的功能:
比如,你想看看都有哪些程序占用了本机的22端口,则可以通过下面的命令来实现:
其实还有另一种写法,也是可以的:
也就是说,上面的-n tcp22可以简写为22/tcp的形式。这里的tcp是协议类型。fuser中的协议类型有file(默认)、tcp和udp三种。你可以自由组合它们来查找你想要的信息。
最后的最后,我们给大家一个对比图,来展示lsof和fuser的异同所在:
如果大家有任何命令方面的问题,可以通过我的新书《Linux大棚命令百篇》上下册来了解和研究。
最后,欢迎大家关注“Linux大棚”公众号,有技术问题或职业发展问题,欢迎大家找我交流:)