原创:小姐姐味道(微信公众号ID:xjjdog),欢迎分享,转载请保留出处。
软件领域有两种人才,一种是工程型的,一种是研究型的。在Linux领域里,相对于搞内核研究的来说,搞命令行的就属于工程型。工程型也有他自己的苦衷,比如,背诵命令就挺痛苦的,一般来说不太推荐背诵,第一覆盖的面不广,第二记的快忘的也快,浪费脑细胞。牛逼的记法就是用,用时间来冲淡烟云,见微知著,并体验其中的喜悦。爱她并天天抱她上床,真爱才成。
Linux
命令好像还真不少,根本原因就是软件多,也有像 ag
这样的命令想替代 grep
,但大多数命令古老而坚挺。不是因为这些软件设计的有多好,原因是一些软件最开始入驻了系统,时间久了,就变成了一种约定,这种习惯改变代价太大,就像把所有键盘的 L
和 F
换一下一样。
这片文章假定你已经了解大多数Linux命令,并了解操作系统的基本元素。如果你现在了解的命令还不足10个,下面的内容就不用看了。除了最基本的东西,本文列出一些对你的面试最常见的最能加分的地方,有些组合可能是你没见过的技巧。但本文仅仅是给出一个大致的轮廓和印象,为以后的专题性考察点作一个序。
本文中出现的所有命令,应该熟记并熟练使用。
首先对目前的Linux版本有个大体的印象,大体分Desktop版和Server版,已经是百花齐放。
|
分隔,前面命令的输出作为后面命令的输入,可以串联多个 < > >>
echo $SHELL
可以看到当前用户的shell,对应的配置文件也要相应改变。比如 .zshrc
, .bashrc
进入linux,我们首先关注的是四个元素:内存,cpu,存储,网络。Linux提供了足够的命令,让你窥探它的每个角落。接下来的命令都是些最常用的,不管精通不精通,想不起来要打屁股。
top
查看cpu的load,使用shift+p按照cpu排序。需要了解wa,us等都是什么意思 uptime
查看系统启动时间和load,load是什么意思呢?什么算是系统过载?这是个高频问题,别怪我没告诉你 ps
命令勃大茎深,除了查进程号外,你还需要知道R、S、D、T、Z、<、N状态位的含义 top
和 ps
很多功能是相通的,比如 watch "ps -mo %cpu,%mem,pid,ppid,command ax"
相当于top的进程列表; top -n 1 -bc
和 ps -ef
的结果相似。 kill
杀死进程。对java来说,需要关注 kill -9
、 kill -15
、 kill -3
的含义,kill的信号太多了,可以用 kill -l
查看,搞懂大多数信号大有裨益。 &
符号在后台执行,比如 tail -f a.log &
。 jobs
命令可以查看当前后台的列表,想恢复的话,使用 fg
回到幕前。这都是终端作业,当你把 term
关了你的后台命令也会跟着消失,所以想让你的程序继续执行的话,需要 nohup
命令,此命令需要牢记 free -m
命令,了解free、used、cached、swap各项的含义 cat /proc/meminfo
查看更详细的内存信息 细心的同学可能注意到,CPU和内存的信息,通过top等不同的命令显示的数值是一样的。 slabtop
用来显示内核缓存占用情况,比如遍历大量文件造成缓存目录项。曾在生产环境中遇到因执行 find /
造成 dentry_cache
耗尽服务器内存。 vmstat
命令是我最喜欢也最常用的命令之一,可以以最快的速度了解系统的运行状况。每个参数的意义都要搞懂。 df -h
查看系统磁盘使用概况 who
命令发现女神正在终端上,可以求爱 网络方面推荐安装体验一下kaliLinux,上面的工具会让你high到极点。
linux的命令很有意思,除了各种stat来监控状态,也有各种trace来进行深入的跟踪,也有各种top来统计资源消耗者,也有各种ls来查看系统硬件如lsblk、lsusb、lscpi。基本上跟着你的感觉走,就能找到相应的工具,因为约定是系统中最强大的导向。
Linux有个比较另类的目录 /proc
,承载了每个命令的蹂躏。像 sysctl
命令,就是修改的 /proc/sys
目录下的映射项。不信看看 find /proc/sys -type f | wc -l
和 sysctl -a| wc -l
的结果是不是很像?
/proc文件系统是一个伪文件系统,它只存在内存当中,而不占用外存空间。只不过以文件系统的方式为访问系统内核数据的操作提供接口。系统的所有状态都逃不过它的火眼金睛。例如:
cat /proc/vmstat
看一下,是不是和 vmstat
命令的输出很像? cat /proc/meminfo
是不是最全的内存信息 cat /proc/slabinfo
这不就是 slabtop
的信息么 cat /proc/devices
已经加载对设备们 cat /proc/loadavg
load avg原来就躺在这里啊 cat /proc/stat
所有的CPU活动信息 ls /proc/$pid/fd
静静地躺着 lsof
的结果 一般排查问题也是围绕着内存cpu等几个元素去排查。下图是一张大体的排查故障或者性能问题的过程,看图,不多说。
下面举例从具体应用场景来说明各种命令的组合应用,此类场景数不胜数,需要个人积累。但强烈建议将sed和awk练的熟练一些。
top -H -p pid ps -mo spid,lwp,stime,time,%cpu -p pid
printf 0x%x n
jstack -l pid| grep spid -A 100
netstat -ant | awk '{print $6}' | sort | uniq -c | sort -n -k 1 -r
首先使用netstat查看列表,使用'awk'截取第六列,使用 uniq
进行统计,并对统计结果排序。当然,也可以这样。 netstat -ant | awk '{arr[$6]++}END{for(i in arr){print arr[i]" "i }}' | sort -n -k 1 -r
这和“分析apache日志,给出当日访问ip的降序列表”是一样的问题。
首先要了解/proc/$pid/smaps里有我们所需要的各种信息,其中Swap字段即是我们所需要的。只要循环遍历一下即可。
for i in `cd /proc;ls |grep "^[0-9]"|awk ' $0 >100'` ;do awk '/Swap:/{a=a+$2}END{print '"$i"',a/1024"M"}' /proc/$i/smaps ;done |sort -k2nr 复制代码
最后,附上http://www.brendangregg.com/ 的大图一张
作者简介: 小姐姐味道 (xjjdog),一个不允许程序员走弯路的公众号。聚焦基础架构和Linux。十年架构,日百亿流量,与你探讨高并发世界,给你不一样的味道。我的个人微信xjjdog0,欢迎添加好友,进一步交流。