开发者社区> 问答> 正文

【精品问答】高级Java工程师,有哪些linux知识是必须了解的?

【精品问答】高级Java工程师,有哪些linux知识是必须了解的?

展开
收起
请回答1024 2020-04-01 10:41:26 2730 0
3 条回答
写回答
取消 提交回答
  • 一些基本的对文件的操作以及系统的相关设置

    2020-04-04 23:52:34
    赞同 展开评论 打赏
  • 下一站是幸福

    作为刚入门的小菜鸡,Linux用得最多的无非就是cd\ls\shell这些

    2020-04-04 13:11:49
    赞同 展开评论 打赏
  • 1.gif

    作为一个javaer,我以前写过很多关于Linux的文章。但经过多年的观察,发现其实对于大部分人,有些东西压根就用不着。用的最多的,就是到线上排查个问题而已,这让人很是苦恼。那么,我们就将范围再缩小一下。

    2.png

    Linux生产环境上,最常用的一套“Sed“技巧

    Linux生产环境上,最常用的一套“AWK“技巧

    Linux生产环境上,最常用的一套“vim“技巧

    Linux命令好像还真不少,根本原因就是软件多,也有像ag这样的命令想替代grep,但大多数命令古老而坚挺。不是因为这些软件设计的有多好,原因是一些软件最开始入驻了系统,时间久了,就变成了一种约定,这种习惯改变代价太大,就像把所有键盘的L和F换一下一样。

    这片文章假定你已经了解大多数Linux命令,并了解操作系统的基本元素。如果你现在了解的命令还不足10个,下面的内容就不用看了。除了最基本的东西,本文列出一些对你的面试最常见的最能加分的地方,有些组合可能是你没见过的技巧。但本文仅仅是给出一个大致的轮廓和印象,为以后的专题性考察点作一个序。

    本文中出现的所有命令,应该熟记并熟练使用。

    几种比较典型的Linux系统

    首先对目前的Linux版本有个大体的印象,大体分Desktop版和Server版,已经是百花齐放。

    • Ubuntu 最常见的Linux个人发行版,一位有情怀的南非富豪,有了钱你也可以这么做

    • CentOS 最常用Linux服务器发新版,RHEL的开放版本,因版权而生的轮子

    • Arch 滚动升级,海量二进制包,社区活跃,个人最爱

    • Gentoo 安装软件需要从源码开始编译,稳定,但用起来会很痛

    • LFS 从零构建Linux,跟着做一遍,Linux每根毛都看的清清楚楚

    • Kali 专做渗透用的,代表了发行版的一个发展路径,就是领域

    首先要了解的概念

    • KISS Keep it Simple and Stupid,据说是哲学

    • 一切皆文件 通常是文件的东西叫文件,进程、磁盘等也被抽象成了文件,比较离谱的管道、设备、socket等,也是文件。

      这是Linux最重要的组织方式。

    • 管道 | 分隔,前面命令的输出作为后面命令的输入,可以串联多个

    • 重定向

      < 将文件做为命令的输入

      将命令的输出输出到文件

      将命令的输出追加到文件

    • SHELL 首先确认你的shell,一般最常用的是bash,也有不少用csh,zsh等的,通过echo $SHELL可以看到当前用户的shell,对应的配置文件也要相应改变。 比如.zshrc,.bashrc

    四大元素

    进入linux,我们首先关注的是四个元素:

    内存,cpu,存储,网络。

    Linux提供了足够的命令,让你窥探它的每个角落。

    接下来的命令都是些最常用的,不管精通不精通,想不起来要打屁股。

    3.jpg

    CPU

    • 使用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命令,此命令需要牢记

    • mpstat 显示了系统中 CPU 的各种统计信

    • 了解cpu亲和性

    内存

    • free -m 命令,了解free、used、cached、swap各项的含义

    • cat /proc/meminfo 查看更详细的内存信息

      细心的同学可能注意到,CPU和内存的信息,通过top等不同的命令显示的数值是一样的。

    • slabtop 用来显示内核缓存占用情况,比如遍历大量文件造成缓存目录项。

      曾在生产环境中遇到因执行find /造成dentry_cache耗尽服务器内存。

    • vmstat 命令是我最喜欢也最常用的命令之一,可以以最快的速度了解系统的运行状况。

      每个参数的意义都要搞懂。

    • swapon、swapoff 开启,关闭交换空间

    • sar 又一统计类轮子,一般用作采样工具

    存储

    • 使用df -h查看系统磁盘使用概况

    • lsblk 列出块设备信息

    • du 查看目录或者文件大小

    网络

    • rsync 强大的同步工具,可以增量哦

    • netstat 查看Linux中网络系统状态信息,各种

    • ss 它能够显示更多更详细的有关TCP和连接状态的信息,而且比netstat更快速更高效。

    • curl、wget 模拟请求工具、下载工具。

      如wget -r http://site 将下载整个站点

    • ab Apache服务器的性能测试工具

    • ifstat 统计网络接口流量状态

    • nslookup 查询域名DNS信息的工具,在内网根据ip查询域名是爽爆了

    • nc 网络工具中的瑞士军刀,不会用真是太可惜了

    • arp 可以显示和修改IP到MAC转换表

    • traceroute 显示数据包到主机间的路径,俗称几跳,跳的越少越快

    • tcpdump 不多说了,去下载wireshark了

    • wall 向当前所有打开的终端上输出信息。

      使用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等几个元素去排查。下图是一张大体的排查故障或者性能问题的过程,看图,不多说。

    4.jpg

    应用场景举例

    下面举例从具体应用场景来说明各种命令的组合应用,此类场景数不胜数,需要个人积累。但强烈建议将sed和awk练的熟练一些。

    怎么查看某个Java进程里面占用CPU最高的一个线程具体信息?

    • 获取进程中占用CPU最高的线程,计为n。

      使用top top -H -p pid,肉眼观察之

      使用ps ps -mo spid,lwp,stime,time,%cpu -p pid

    • 将线程号转化成十六进制printf 0x%x n

    • 使用jstack找到相应进程,打印线程后的100行信息 jstack -l pid| grep spid -A 100

    统计每种网络状态的数量

    netstat -ant | awk '{print $6}' | sort | uniq -c | sort -n -k 1 -r![5.jpg](https://ucc.alicdn.com/pic/developer-ecology/655b656daf0344d58dbfd798fe1460b8.jpg)
    
    
    

    首先使用netstat查看列表,使用’awk’截取第六列,使用uniq进行统计,并对统计结果排序。当然,也可以这样。

    netstat -ant | awk '{arr[$6]++}END{for(i in arr){print arr[i]" "i }}' | sort -n -k 1 -r
    
    

    这和“分析apache日志,给出当日访问ip的降序列表”是一样的问题。

    怎么查看哪个进程在用swap

    首先要了解/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
    

    End

    软件领域有两种人才,一种是工程型的,一种是研究型的。在Linux领域里,相对于搞内核研究的来说,搞命令行的就属于工程型。工程型也有他自己的苦衷,比如,背诵命令就挺痛苦的,一般来说不太推荐背诵,第一覆盖的面不广,第二记的快忘的也快,浪费脑细胞。牛逼的记法就是用,用时间来冲淡烟云,见微知著,并体验其中的喜悦。爱她并天天抱她上床,真爱才成。

    原创:小姐姐味道。

    2020-04-01 11:01:13
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
Spring Cloud Alibaba - 重新定义 Java Cloud-Native 立即下载
The Reactive Cloud Native Arch 立即下载
JAVA开发手册1.5.0 立即下载