Linux重度使用命令详解(科普top,uptime,ps,netstat命令)一
  TEZNKK3IfmPf 2023年11月14日 40 0

前言:

看到本文的标题,可能会有很多小伙伴会感觉比较奇怪,什么是重度?这里的重度的意思是在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和内存)和所有在运行的进程(仍然是实时的,这里是软件层面的)以及每个进程运行的详细信息(也就是可以大致分为两大部分,硬件信息和软件信息)。大概是这样婶的:

Linux重度使用命令详解(科普top,uptime,ps,netstat命令)一

 上图可以看到,前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命令,然后回车:

Linux重度使用命令详解(科普top,uptime,ps,netstat命令)一

 Linux重度使用命令详解(科普top,uptime,ps,netstat命令)一

 这里注意,是回车两次:

Linux重度使用命令详解(科普top,uptime,ps,netstat命令)一

Linux重度使用命令详解(科普top,uptime,ps,netstat命令)一

 

二,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服务的安装位置啦(由于暂时没有实验环境,故暂时无法演示。)。

【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月14日 0

暂无评论

推荐阅读
  TEZNKK3IfmPf   2024年05月31日   51   0   0 linux服务器
  TEZNKK3IfmPf   2024年05月31日   29   0   0 linux服务器centos
  TEZNKK3IfmPf   2024年05月31日   29   0   0 linuxbind
  TEZNKK3IfmPf   2024年05月31日   39   0   0 linuxshell
TEZNKK3IfmPf