大家好,我是xindoo,今天和大家分享下一个我的观点——程序猿都应该学点Linux命令!这也是这两年我做后端开发的切身体会。认识我的人可能都知道,我职业生涯比较“特殊”,我毕业后先是干的运维,然后再转的Java开发。 运维的经历苦不堪言,但积累下来的运维相关经验却让我在转开发后受益匪浅,其中一项就是熟悉大部分常用的Linux命令。 我已经记不清多少次只用几行命令搞定别人半天都没搞定的事儿,然后拂袖离去,深藏功与名……
学好linux命令有啥用?
用linux命令日常提效的例子数不胜数,我说一些对我的明显作用。
快速排查和定位问题
举个很简单的场景,早上去上班,刚坐下突然收到服务器的报警,CPU使用率98%!登陆服务器top命令可以快速定位到是哪个进程或者线程,sar命令定位出问题发生时间点,用cat、grep等命令快速找到出问题时的日志……,分分钟解决问题。当高手泡杯茶的功夫解决问题时,新手还不知所措。
关于性能问题定位的命令,我之前翻译过篇文章10行命令60秒快速定位性能瓶颈有兴趣可以了解下。
数据清洗和统计
数据清洗和统计的方法很多,就比如用excel就可以完成很多类型的统计工作,但针对一些简单的统计,我自己写个shell脚本也能分分钟搞定,尤其是当需要被统计的数据是直接在服务器上时。比如这台机器上服务今天员工报过多少次error。还有从日志中解析出某个接口今天所有请求的平均、最大、最小耗时…… 像这种简单的数据清洗和统计,我用grep、awk也能分分钟完成。
印象比较深的一个经历,有次我们在排查某个问题时,从两个系统中导出了两份用户数据,想对比下每个用户在两个系统里的数据差异,当时数据量还是挺多的。这种问题你会怎么办? 从服务器上拉到本地,然后用excel的vlookup好像也行。当服务器上数据不允许下载呢?
这两份数据如果是数据库里的两个表,很明显就是将两个表直接join起来(当时也有同事提出先将数据入库)。但在linux上用awk命令可以很容易实现这个功能,后来我也把具体方法写了一篇博客awk实现类sql的join操作 。
辅助开发
辅助开发的事就数不胜数了,比如我用wget命令下载文件,用curl命令调试接口,用dig、ping、nc测试网络,用wrk压测接口……
装X
这个就不多说了,在控制台各种敲,很geek。
如何学习Linux命令
以上说了好多学好linux命令的优点,我相信你肯定按捺不住想要学了,这里我分享一些我的学习方法。
多练习,但没必要太刻意练习
这个也算是老生常谈了,如何东西想要熟练,都需要大量的刻意练习,学习linux命令也不例外。 但我这里给一个忠告,就是没必要一次性花太多的时间去熟练掌握某个linux命令,尤其是有些比较冷门的命令。 很多命令确实很不常用,如果你执着于一次性掌握其所有参数,但长期不使用肯定还是会忘记,到时候还是得重新学,投入产出比太低。
比如我之前学习过tcpdump的使用,当时大部分的参数基本都会用了,但tcpdump在日常工作中使用的太少了,而且也涉及到大量网络的知识,我已经很长时间没有用过了, 已经忘记怎么使用了。 像这种工作中不太涉及,也不常用的命令,了解下就可以了,知道它能干什么足以,等真正有需求的时候再去学。
先知道有什么样的命令,再考虑怎么去用
Linux命令及其参数不能用浩如烟海来描述,但也算是数不胜数了,索性大部分的命令及参数是不会用到的,但也推荐大家稍微记录下。 就比如我今天早上遇到一凌晨OOM的问题,我想去追溯那段时间机器的负载情况,最简单的方式就是用sar命令,方便快捷,虽然我早已忘记具体的参数,但man或者搜索下立马就知道了。
所以我的建议是先知道有什么样的命令,然后再按需求去了解具体命令的使用方式。初学者应该从最简单最常用的命令开始学起,比如下图中的命令。
网上有很多常用命令的参考指南,我之前也写过一篇博客我常用的Linux命令
善用man和搜索引擎
在linux中,所有命令的使用方式都可以通过man命令来查询,包括详细的示意,各种参数的作用都有,都是命令的开发者提供了,肯定保证准确无误,不过缺点是都是英文的,而且有些篇幅较长,对像我这种英文不太好的人不是很友好。
另外,搜索引擎也是了解一个linux如何使用的好工具,网上有各种相关博客,有些入门网站(比如菜鸟教程)也有比较体系化的教学内容,甚至有时候还可以找到你问题的解决方案。这种方式对新手比较友好,但这种方式的缺点是内容质量参差不齐,自己要做好信息的辨别和筛选。
对于我不熟悉的linux命令,我日常是两种方法都使用,比较倾向于第二种,但在第二种无法解决我问题时我会去看man收藏,去寻找更专业的资料。
收藏代码片段
我可能比较偏实用主义,学linux命令大多数情况都是为了解决具体的问题,而我遇到的问题各式各样,使用的方法也不一样,可能时隔好久才会重复出现,等出现时之前用的解决方案早就忘记了。为避免这种问题,我开始用snippetsLab记录一些常用的代码片段,将自己写的稍微复杂且不是很常用的代码片段保存起来,加上描述和标签方便检索,等之后如果再用到可以快速找回。
比如像上文中awk实现join的功能,稍微有点复杂,每次让我重新写也不是写不出来,但还是需要花点时间调试的。 这种与其每次都调,还不如记录下来下次贴过来直接使用。 这两年我已经在snippetsLab中记录了数百条代码片段了。
结语
说真的,虽然我不推荐做运维这个工作,尤其是在国内,但我非常建议大家了解下运维相关的技能,尤其是各种常用的linux命令,不管你是前端还是后端、不过是java还是go程序猿,都应该了解常用的linux命令。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。