前言
只有光头才能变强。
文本已收录至我的 GitHub 仓库,欢迎 Star:https://github.com/ZhongFuCheng3y/3y
之前写过一篇《在公司做的项目和自己在学校做的有什么区别?》不知道大家还有印象没有,里面提到了在工作中可能需要等上 Linux 服务器,查看一些信息(特别是查日志找 Bug)。
我在大学的时候也有过 Linux 的课程,在期间也做过 Linux 相关的笔记:
- 看完这篇 Linux 基本的操作就会了
- 用户和权限管理看了你就会用啦
- Linux 进程管理
- Linux 网络管理
但是,在学校学完,没咋练手(还是太菜了),去到公司可以说是全忘光了。这篇文章主要来回顾以前的笔记,以及记录一下在工作中比较常用的一些命令。
- 我这肯定是以我现在的维度来考量的,我工作时长比较短,所以可能会有很多命令会忽略掉了,欢迎在评论区补充
一、查看日志
线上出现了问题,登上线上的机器查日志是 非常常见 的操作了。我第一次登上线上机器查日志的时候,我还只记得以下的几个命令(假设现在我们的日志文件叫做service.log
):
cat service.log
tail -f service.log
vim serivice.log
- (明显是不够用的)
现在日志每天产出的大小大概 1GB:
如果是小文件的话,单纯的 cat
命令还是可以应付的,但如果你直接用 cat
命令打开一个 1GB 的日志文件,保证卡死你(ctrl + c
退出 cat
命令需要很久才能将 cat
命令停下来)。
- 一般我只用
cat
来查看这个小文件的文本内容是什么
同样地,如果是小文件,单纯的 vim
命令去打开文件也是可以应付的,但如果你用 vim
命令去打开一个 1GB 甚至更大的文件,也能 明显 感受到缓慢和卡顿。
平时我还是很喜欢用 vim
去查找对应的记录的,我一般的操作:
vim service
- 按
G
跳转到文件的末尾 - 按
?
+ 关键字搜索对应的记录 - 按
n
往上查询,按N
往下查询
tail -f service.log
这个命令我一般用于查看流量是否进来了(或者调试的时候可以直接看到日志,再迅速 ctrl +c
关掉)
面对比较大的日志文件,这我们就得配合 grep
来玩了,比如我们现在得知某个手机号收不到短信验证码,想要看一下这个手机号的日志是怎么样的。于是我们就可以这样搞:
cat service.log | grep 13888888888
这么一搞,就能将 service.log
中所有含有 13888888888
的记录给搜出来,搜索的速度还是贼快的。
现在我们已经能根据关键字搜到对应的记录了,接着我想看一下 那条记录的日志上下文【这样就能知道这条数据大概的执行状态了】
首先,我们先要查出对应记录的行号,在cat
命令后面加上一个 -n
参数就好了。所以命令是:cat -n service.log | grep 13888888888
,如下图我们就可以查到对应的行号了
现在行数是 29506,我们一般只要看一下 29506 的前 10 行和后 10 行就差不多知道问题出现在哪了,于是我们可以这样做:
-
sed -n "29496,29516p" service.log
:从 29496 行开始检索,到 29516 行结束 -
cat -n service.log | tail -n +29496 | head -n 20
: 从 29496 行开始检索,往前推 20 条
如果关键字不太准确(日志输出的记录太多了),我们可以使用 more
命令来浏览或者输出到文件上再分析:
-
cat service.log | grep 13 |more
:将查询后的结果交由 more 输出 -
cat service.log | grep 13 > /home/sanwai/aa.txt
将查询后的结果写到/home/sanwai/aa.txt
文件上
有的时候,我们想统计这个日志输出了多少行,我们可以使用这条命令:
cat service.log | wc -l
参考资料:
- https://www.cnblogs.com/xiashan17/p/7059978.html
二、查进程和端口
查进程有两个命令:
ps -ef
ps aux
上面两个命令都是列出所有的进程,我们还是通过 |
管道和grep
来过滤掉想要查的进程,比如说:ps -ef |grep java
把进程查出来干嘛?知道它的进程 ID 了,我们可以把他给杀掉。
-
kill -9 processId
:杀掉某个进程
查端口也是一个很常见的操作,常见命令:netstat -lntup
:
l:listening n:num t:tcp u:udp p:display PID/Program name for sockets
查看当前所有 tcp/udp 端口的信息
查看某个端口详细的信息:lsof -i:4000
三、查看系统的状态
3.1 TOP 实时查看进程的状态
TOP命令查看进程的状态,其中有个 load average 可能不是那么好理解,下面来解释一下:
load average:在特定时间间隔内 运行队列中 (在 CPU 上运行或者等待运行多少进程) 的平均进程数。
load average 有三个值,分别代表: 1 分钟、5 分钟、15 分钟 内运行进程队列中的平均进程数量。
- 正在运行的进程 + 准备好等待运行的进程 在特定时间内(1 分钟,5 分钟,10 分钟)的平均进程数
Linux 进程可以分为三个状态:
- 阻塞进程
- 可运行的进程
- 正在运行的进程
比如现在系统有 2 个正在运行的进程,3 个可运行进程,那么系统的 load 就是 5,load average 就是 一定时间内的 load 数量均值。
3.2free 查看内存使用状况
linux 的内存管理机制的思想包括(不敢说就是)内存利用率最大化 ,内核会把剩余的内存 申请为 cached,而 cached 不属于 free 范畴。
如果 free 的内存不够,内核会把 部分 cached 的内存回收,回收的内存再分配给应用程序。所以对于 linux 系统,可用于分配的内存不只是 free 的内存,还包括 cached 的内存(其实还包括 buffers)。
- 可用内存=free 的内存 +cached 的内存 +buffers
Buffer Cache 和 Page Cache。前者针对磁盘块的读写,后者针对文件 inode 的读写。这些 Cache 有效缩短了 I/ O 系统调用 (比如 read,write,getdents) 的时间。磁盘的操作有 逻辑级(文件系统)和物理级(磁盘块)
参考资料:
- https://blog.csdn.net/zhangch…
- https://www.cnblogs.com/peida…
最后
我工作时长比较短,所以可能会有很多命令会忽略掉了,欢迎在评论区补充比较常用的命令。后续如果某些命令比较重要的,我再分享哈~
乐于输出 干货 的 Java 技术公众号:Java3y。公众号内 有 200 多篇原创 技术文章、海量视频资源、精美脑图,关注即可获取!
觉得我的文章写得不错,点 赞!