前言:
看到本文的标题,可能会有很多小伙伴会感觉比较奇怪,什么是重度?这里的重度的意思是在Linux系统中使用率非常高的命令,也就是在日常运维工作中会以极高的频率使用的一些命令。
当然了,虽然都是一些比较简单的命令,但用处和需要注意的细节非常多,并且也是可以有所分类的,比如本文所将要讲解的这四个命令,是快速查看系统状态类命令,想要用好这些重度命令也不是一个简单的事,不信你就往下看吧~~~~~~!!!!!
一,top命令
top命令的使用场景一般为运维巡检和当系统出现异常卡顿的时候,需要通过此命令快速获取整体系统的CPU,内存,各个主要进程的状态,从而判断 系统运行是否健康,或者快速定位到异常原因,从而据此准确给出调整系统运行的方案。
因,top命令输出的内容有关于进程的,因此,该命令和ps命令深度绑定,在日常使用中,通常会结合ps命令来同时使用。
top命令无关权限,普通用户或者root用户都可使用,因此,该命令是一个比较重要的命令,很多系统的关键信息是可以通过这个命令获取到的。
(1)top命令的帮助解析
top --help的输出如下(help是简单显示了top命令的一些常用参数,如果觉得帮助不够,可以man top了,在此不多介绍了):
[root@hdp-1 ~]# top --help
top: inappropriate '-help'
Usage:
top -hv | -bcHiOSs -d secs -n max -u|U user -p pid(s) -o field -w [cols]
当然,top命令通常是不需要带参数运行的,也就是直接top 甩到终端里就可以了,如果非要使用参数,那么,-u U -p 参数比较实用。
top -u 用户等于top U 用户,仅仅显示指定的这个用户的所有进程,比如,我显示我的普通用户zsk运行的所有进程,命令为 top U zsk 输出如下:
top - 01:34:05 up 1:11, 2 users, load average: 0.01, 0.02, 0.02
Tasks: 184 total, 1 running, 183 sleeping, 0 stopped, 0 zombie
%Cpu(s): 0.0 us, 0.0 sy, 0.0 ni,100.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
KiB Mem : 8173312 total, 7845164 free, 199656 used, 128492 buff/cache
KiB Swap: 4718588 total, 4718588 free, 0 used. 7767732 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
1870 zsk 20 0 115448 2060 1652 S 0.0 0.0 0:00.01 bash
1912 zsk 20 0 162016 2328 1584 R 0.0 0.0 0:00.01 top
top -p 1 显示系统守护进程,比如,我查询我的php-fpmpid为1414,那么,top -p 1414,输出如下:
top - 01:33:09 up 1:10, 2 users, load average: 0.03, 0.03, 0.02
Tasks: 1 total, 0 running, 1 sleeping, 0 stopped, 0 zombie
%Cpu(s): 0.0 us, 0.0 sy, 0.0 ni,100.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
KiB Mem : 8173312 total, 7845560 free, 199260 used, 128492 buff/cache
KiB Swap: 4718588 total, 4718588 free, 0 used. 7768128 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
1 root 20 0 191024 4020 2584 S 0.0 0.0 0:01.39 systemd
top - 01:29:59 up 1:07, 2 users, load average: 0.00, 0.01, 0.02
Tasks: 1 total, 0 running, 1 sleeping, 0 stopped, 0 zombie
%Cpu(s): 0.0 us, 0.0 sy, 0.0 ni,100.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
KiB Mem : 8173312 total, 7845764 free, 199056 used, 128492 buff/cache
KiB Swap: 4718588 total, 4718588 free, 0 used. 7768332 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
1414 apache 20 0 405064 6748 800 S 0.0 0.1 0:00.00 php-fpm
top -u 用户 这个命令的实际意义是能够快速查询比如postgresql,es这样的使用专属普通用户启停的服务,能够快速的查询,定位到服务的问题,比如,es运行出现问题了,而es一般是使用普通用户es启停和运行的,那么,top U es 将会仅仅输出显示es这个服务的详细进程。
(2)top命令无参输出解析以及我们应该重点关注的地方是哪些
首先,应该了解top命令类似watch,tail -f 命令,运行后会一直在前台显示,直到你摁了q键才会推出命令,其次,top命令是一个综合性的命令,会显示硬件的实时运行状态信息(CPU和内存)和所有在运行的进程(仍然是实时的,这里是软件层面的)以及每个进程运行的详细信息(也就是可以大致分为两大部分,硬件信息和软件信息)。大概是这样婶的:
上图可以看到,前5行主要是关于硬件的,显白的直到末尾是关于系统所有进程的详细信息。
我们需要关注的信息有人如下几个:
以上图为例:
第一行全部,我们可以得出的信息时,top命令的执行时间是9:24,系统开机 运行时间是41分钟,当前整个系统有一个用户登录或者运行了某个程序,CPU的负载状态1分钟,5分钟和15分钟比率都接近0。其实,第一个行的内容等于缩略版的w命令,基本等价于uptime命令。请看下图:
[root@centos1 ~]# w
19:13:59 up 11 min, 3 users, load average: 0.00, 0.01, 0.02
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
root tty1 19:03 10:47 0.00s 0.00s -bash
root pts/0 192.168.153.1 19:03 7.00s 0.02s 0.00s w
root pts/1 192.168.153.1 19:12 55.00s 0.01s 0.01s -bash
那么, load average 意思是CPU的负载情况,CPU又分为单核,双核,多核,单cpu,双CPU,多CPU这些情况,比如,现有一个服务器,CPU的规格是4CPU 8核心,那么,load average 不管是 1分钟,5分钟还是15分钟,其数值不应该超过32,否则代表CPU已满载运行,系统已经有异常了。那么,如果一个服务器,CPU规格是2CPU 8核心,那么,三个数值不应该大于16即可,单核单cpu,当然是三个数值不大于1为健康啦,以此类推。
第二行task这一行也是需要重点关注的,stopped(进程异常停止了)和zombie(进程僵住了)应该是一直保持0,如果这两项有非零情况,表示系统出问题了,僵尸进程不在本文讨论,请自行百度学习。异常停止和僵尸进程都需要我们警惕的。
第三行是CPU详细的使用信息,具体意义不需要了解,只需要知道,id的数值通常在99%,这个是正常,越高越好,代表CPU运行健康,其余数值越小越好,接近0是正常的数值。
第五行的used需要重点关注,数值为0表示内存运行正常,如果是非零的情况,表示内核正在不断进行内存和swap的数据交换,说明内存不够了或者运行程序内存溢出了。
进程部分需要关注的部分(比如,以下图做一个示例):
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
1290 root 20 0 146416 2288 1420 R 0.3 0.1 0:01.04 top
1 root 20 0 41252 3652 2360 S 0.0 0.2 0:01.03 /usr/lib/systemd/systemd --switched-root --system --deserialize 21
2 root 20 0 0 0 0 S 0.0 0.0 0:00.02 [kthreadd]
3 root 20 0 0 0 0 S 0.0 0.0 0:00.00 [ksoftirqd/0]
5 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 [kworker/0:0H]
6 root 20 0 0 0 0 S 0.0 0.0 0:00.13 [kworker/u256:0]
7 root rt 0 0 0 0 S 0.0 0.0 0:00.30 [migration/0]
8 root 20 0 0 0 0 S 0.0 0.0 0:00.00 [rcu_bh]
9 root 20 0 0 0 0 S 0.0 0.0 0:00.00 [rcuob/0]
10 root 20 0 0 0 0 S 0.0 0.0 0:00.00 [rcuob/1]
11 root 20 0 0 0 0 S 0.0 0.0 0:00.00 [rcuob/2]
重点关注第8列,也就是 S 这一列,以及后面的第9列 %CPU 和第10列 %MEM。
第8列不应该看到除了r和s以外的其他符号,如果有显示D这个字母,表明io读写出问题了,只有重启机器这一个办法,进程此时是不能被kill的。Z和T分别代表僵尸进程和停止的进程,一般情况下都是比较少见的。
第九列%CPU表示进程占用CPU的时间的百分比,如果某一个进程该列数值比较高,说明,这个进程一直在进行计算活动,需要引起重视。
第十列%MEM表示进程使用了多少物理内存,如果交换内存也就是第五行的used数值不停变换,那么,我们应该定位到%MEM数值较高的进程,重启该进程予以释放物理内存(如果是非系统进程的话)
(3)top的交互命令
h 显示帮助画面,给出一些简短的命令总结说明
k 终止一个进程。
i 忽略闲置和僵死进程。这是一个开关式命令。
q 退出程序
r 重新安排一个进程的优先级别
S 切换到累计模式
s 改变两次刷新之间的延迟时间(单位为s
f或者F 从当前显示中添加或者删除项目
o或者O 改变显示项目的顺序
l 切换显示平均负载和启动时间信息
m 切换显示内存信息
t 切换显示进程和CPU状态信息
c 切换显示命令名称和完整命令行
M 根据驻留内存大小进行排序
P 根据CPU使用百分比大小进行排序
T 根据时间/累计时间进行排序
W 将当前设置写入~/.toprc文件中
u 切换显示用户进程,等同于top -u 用户命令
比如,我现在有安装nginx,并且nginx这个服务是以nginx用户运行的,那么,我想快速重启nginx的进程,应该如何做呢?
top >u>nginx>k 输入查询到的pid号,回车即可结束nginx,这样做显然更方便,不需要ps命令查出来pid在kill -9 查出来的pid 这么麻烦了,下面以图片形式演示:
输入top命令,然后回车:
这里注意,是回车两次:
二,uptime命令
top命令可以看做是一个综合的复合命令,uptime则是一个比较单纯的 命令了,基本等价于top命令的第一行,主要用途是通过awk,grep,sed,cut等文本处理工具截取有用的信息,比如,截取load average的15分钟CPU负载值,脚本内设定一个阈值,两个值比较以做监控,说人话,也就是通常用在监控类的脚本内,该命令提供数据源。
三,ps命令
ps命令大胆猜测是 processes stat的缩写,也就是进程状态的英文缩写。
ps命令是一个十分重要的重度使用命令,此命令的作用为:
可以确定有哪些进程正在运行和运行的状态、进程是否结束、进程有没有僵尸、哪些进程占用了过多的资源等等.总之大部分关于进程的信息都是可以通过执行该命令得到的。
ps命令的运行机制为显示瞬时的所有进程的状态,这一点,与top是不一样的,top命令是持续的实时的显示所有进程的状态,这一点需要尤其注意。
man ps 命令,得到的输出,最开始介绍如下:
PS(1) User Commands PS(1)
NAME
ps - report a snapshot of the current processes.
#上面这一句翻译如下:ps 报告所有的进程的快照
man ps命令后,你会发现,内容茫茫多,但,其实我们主要使用的只是其中的一小部分参数,比如,ps -ef ,ps -efL ,ps aux 这样的形式。
即使使用了参数,我们也会发现输出是茫茫多的,因此,ps命令一般是配合管道符 | grep 命令来快速的过滤出我们想要的结果。
比如,我的系统安装了postgresql数据库,我想要看看数据库是否运行正常,那么, ps aux |grep postgre 这样的模糊过滤即可看到pg数据库的进程情况啦,输出如下:
[root@centos1 ~]# ps aux |grep postgre
postgres 1173 0.0 0.6 272540 13524 ? S Sep08 0:00 /usr/local/pgsql/bin/postmaster -D /usr/local/pgsql/data
postgres 1196 0.0 0.0 272540 1044 ? Ss Sep08 0:00 postgres: checkpointer
postgres 1197 0.0 0.1 272540 2108 ? Ss Sep08 0:00 postgres: background writer
postgres 1198 0.0 0.2 272540 5004 ? Ss Sep08 0:00 postgres: walwriter
postgres 1199 0.0 0.0 273088 1996 ? Ss Sep08 0:00 postgres: autovacuum launcher
postgres 1200 0.0 0.0 126960 948 ? Ss Sep08 0:00 postgres: stats collector
postgres 1201 0.0 0.0 273088 1556 ? Ss Sep08 0:00 postgres: logical replication launcher
root 1894 0.0 0.0 112644 952 pts/0 S+ 03:42 0:00 grep --color=auto postgre
如上图这样的,我们能得出什么结论呢?首先,我们可以看到这个数据库的启动命令就是第一行的最后一列内容啦,在本例中,pg数据库的启动命令是:/usr/local/pgsql/bin/postmaster -D /usr/local/pgsql/data,因此,我们可以知道这个数据库的具体路径是 /usr/local/pgsql/data/,而配置文件都在这个目录下,如果需要修改postgresql,进这个目录就安啦,其次,可以看到pg数据库开启了autovacuum 模式,walwriteer模式,background writer模式,从这些信息可以看出这个数据库的大体配置是什么样的。
我的系统还安装了nginx,想要看看nginx运行是否正常,那么, pa aux |grep nginx 输出如下:
[root@centos1 ~]# ps aux |grep nginx
root 1647 0.0 0.0 47392 1308 ? Ss Sep08 0:00 nginx: master process /usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
nginx 1652 0.0 0.0 47816 1872 ? S Sep08 0:00 nginx: worker process
root 1923 0.0 0.0 112644 948 pts/0 S+ 03:56 0:00 grep --color=auto nginx
这里,我们可以看到nginx的启动命令,启动了一个工作进程,说明nginx的配置文件里worker_processes 配置的是1,根据启动位置,可以看出不是rpm方式安装的nginx,因为路径不是在RPM通常的安装位置。
由此我们可以得出一个结论,ps命令的功能之一就是可以获得很多隐含的非常有用的信息。
ps命令的另一个功能是配合kill命令结束服务的主进程,比如,上图的第一个行,pid为1647,kill -9 1647 即为结束nginx服务。当然,也可以编写脚本,通过脚本自动获取nginx的主进程pid号,然后结束主进程的方式,即为nginx的停止脚本。
比如,我现在有一个RPM安装的php-fpm服务,需要利用脚本停止该服务,脚本应该这样编写(有逻辑判断php-fpm是否启动,如果启动结束该服务,如果没启动,echo "php-fpm并没有启动"):
#!/bin/bash
#!author zsk_john
#! date 2021-09-08
PID=`ps -aux | grep master |grep -v "grep"| awk 'NR == 1' | awk {'print $2'}`
RESULT=`ps -aux | grep master |grep -v "grep"| awk 'NR == 1' | awk {'print $2'}|wc -l`
if [ $RESULT -eq 0 ];
then
echo "php-fpm并没有启动"
else
kill -9 $PID
echo "php-fpm 已经停止啦!!!!"
fi
小结:
ps命令单独使用并没有太出彩的,隐含的信息才是这个命令的魅力所在,管道符的使用以及在脚本中的应用才是更加出彩的地方。
四,netstat命令
netstat命令从名字也可以看出,这个是显示系统内的整体网络情况的命令,由于网络的普及以及应用,我们不免会遇到各种各样的网络问题,而netstat命令简直是为网络而生,连接网络与操作系统之间的一座十分重要的桥梁。
通过netstat命令,我们可以快速的了解系统内的网络情况,基于网络的各种服务的基本情况,而netstat与ps命令又会碰撞出激烈的火花。
netstat命令基本用法为带参运行,也就是说离开参数,netstat命令啥都不是。通常的参数组合为 netstat -antup (为什么是这么个参数组合呢?其实是本着搂草打兔子,upd和tcp两大协议不管有没有,都带上得了,也就是-t -u 这两个参数,p表示program,也就是程序的意思。)例如下图(我的系统内的netstat -antup命令输出):.
root@hdp-1 ~]# netstat -antup
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 1331/sshd
tcp 0 52 192.168.88.11:22 192.168.88.241:51162 ESTABLISHED 1613/sshd: root@pts
tcp6 0 0 :::80 :::* LISTEN 1327/httpd
tcp6 0 0 :::22 :::* LISTEN 1331/sshd
udp 0 0 127.0.0.1:323 0.0.0.0:* 1036/chronyd
udp6 0 0 ::1:323 :::* 1036/chronyd
这里需要详细说明每一列的具体含义:
第一列,表示使用的哪个协议,上图可以看到chronyd这个服务走的是udp协议,httpd走的是tcp6协议,ssh服务使用的是tcp协议。
第二列和第三列,收到的数据包大小和发送的数据包大小,这里尤其注意,除了ssh服务,其余的服务recv和send应该都为0,如果有数值,表示该服务被阻断或者其它原因,也就是说,网络环境是异常的。
第四列和第五列,本地IP地址,远程的地址,从上图可以得出,我是在192.168.88.11这个服务器上使用远程登录工具通过sshd服务登录系统的,我的远程登录工具(其实也就是宿主机)所在IP地址是192.168.88.241,还可以看到本机也就是192.168.88.11这个服务器开启了httpd服务,开放的端口为80.
第六列,这个是网络状态,只有established和listen这两种表示网络是正常的,看到别的,都是不正常的(FIN_WAIT2如果太多,也不正常),所有的网络状态如下:
状态:描述
CLOSED:无连接是活动的或正在进行
LISTEN:服务器在等待进入呼叫
SYN_RECV:一个连接请求已经到达,等待确认
SYN_SENT:应用已经开始,打开一个连接
ESTABLISHED:正常数据传输状态
FIN_WAIT1:应用说它已经完成
FIN_WAIT2:另一边已同意释放
ITMED_WAIT:等待所有分组死掉
CLOSING:两边同时尝试关闭
TIME_WAIT:另一边已初始化一个释放
LAST_ACK:等待所有分组死掉
第七列,应用程序的PID/应用程序名称
如果是一个自建Java服务,或者并不熟悉的服务,此时,我们就可以通过现在开放的端口,利用ps命令倒查服务的概况了,比如,Java服务的启动位置,Java服务的启动命令。
比如,假设有一个Javaweb服务,开启了端口8888,但,我想知道这个Java服务在哪存放的,首先,netstat -antup |grep 8888 查出该服务的pid,然后,ps aux |grep pid,就可以定位到Java服务的安装位置啦(由于暂时没有实验环境,故暂时无法演示。)。