title: Linux ps、top、free命令 author: Gamehu tags: - command categories: - Linux date: 2020-04-21 10:54:00 --- ### 背景 虽然我们系统有建设一些监控工具比如Grafana、Prometheus等,但是很多时候还是愿意直接先到服务器上去瞧一眼,特别是客户现场的问题,因为客户现场暂时不会装这些工具。因为我们是做NPMD的,流量大的时候资源消耗就比较大,加上前期先铺功能非功能需求的细节待完善,所以有时候会出现客户现场机器在一段时间后会变得比较慢的情况,这个时候那当然就说劈里啪啦一堆装逼的命令敲上去瞅瞅服务器咋了。 用的比较高频的命令就是**ps、grep、top**。用的倒是还算一般,不过一直没有深深的了解,所以刚好借着这个机会,深入的学习一下。演示用的是安装centos系统的vps。 ### ps 这命令应该是我使用的命令中的top one了,该命令用于获取正在运行的进程信息。 我们在看一些服务是否运行的时候通常都是用这个命令。我们可以获取任何用户在当前系统上运行的进程之类的信息,例如进程ID(PID)。 ps命令本身是一个扩展工具,ps --help a一下,会发现有很多的命令选项,说是有80多个。 {% asset_img ps.png from 我 %} 当然我们只说说常用的。 #### 基本用法 如果在Linux中使用不带任何选项的ps命令,它将显示当前shell中正在运行的进程: ``` ps ``` 只会看到ps和bash。 ``` PID TTY TIME CMD 2053 pts/0 00:00:00 ps 31585 pts/0 00:00:00 bash ``` - PID是进程的唯一ID - TTY是已登录终端用户的类型。pts表示伪终端 - TIME给您进程运行了多长时间 - CMD是您运行以启动该过程的命令 很明显,我们并没有得到任何真实,有用的信息。 ##### 1.查看所有运行过程 如果要查看自己运行的所有进程,可以将ps命令与选项x一起使用,如下所示: ``` ps -x ``` x选项将显示所有进程,即使它们与当前tty(终端类型)不相关。 “– ”是可选的,但一般的Linux约定是加上“–”选项。 ``` PID TTY STAT TIME COMMAND 543 tty1 Ss+ 0:00 /sbin/agetty --noclear tty1 linux 544 ? Ssl 0:01 /usr/bin/python2 -Es /usr/sbin/firewalld --nofork --nopid 546 ? S 0:00 [hwrng] 556 ? I< 0:00 [cryptd] 943 ? Ss 0:00 /sbin/dhclient -1 -q -lf /var/lib/dhclient/dhclient--eth0.lease -pf /var/run/dhclient-eth0.pid -H vultr eth0 1009 ? Ssl 0:53 /usr/bin/python2 -Es /usr/sbin/tuned -l -P 1012 ? Ssl 0:59 /usr/sbin/rsyslogd -n 1052 ? Ss 0:00 nginx: master process /usr/sbin/nginx 1265 ? Ss 0:02 /usr/libexec/postfix/master -w 12385 ? R 0:00 [kworker/u2:0-ev] 12684 ? Ss 0:00 sshd: root@pts/0 12688 ? Ss 0:00 sshd: root@notty 12690 pts/0 Ss 0:00 -bash ``` 上面输出中的STAT表示过程状态代码。有兴趣可以查一下详细的说明。其实很少会看到仅使用选项x的ps命令。通常以这种方式伴随选项u: ``` ps -ux ``` 使用选项u,您将获得有关每个进程的详细信息: ``` USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND abhishek 503 0.0 0.4 681580 37516 pts/0 Sl 18:09 0:00 gedit abhishek 2245 0.0 0.0 11300 1496 ? S 18:37 0:00 /usr/bin/ssh-agent -D -a /run/user/1000/keyring/.ssh abhishek 3039 0.0 0.0 77344 3508 ? Ss 10:37 0:00 /lib/systemd/systemd --user abhishek 3040 0.0 0.0 114632 360 ? S 10:37 0:00 (sd-pam) abhishek 3054 0.0 0.1 517104 11512 ? SLl 10:37 0:01 /usr/bin/gnome-keyring-daemon --daemonize --login ``` 如您所见,现在您获得了每个进程的用户名以及CPU [使用率](https://linuxhandbook.com/linux-memory-usage/)和[内存使用率](https://linuxhandbook.com/linux-memory-usage/)。RSS显示该进程当前在RAM中有多少内存,而VSZ显示该进程总共有多少虚拟内存。 ##### 2.使用ps aux命令查看所有正在运行的进程 您可能会一直在Linux教程和文档中看到`ps -aux`或看到`ps aux`它们。 使用添加的-a选项,您可以查看[Linux系统上所有用户](https://linuxhandbook.com/linux-list-users/)的运行进程。 ``` ps -aux ``` 命令输出与ps -ux相同,但是现在您也具有其他用户的进程。由于使用-u选项,您可以识别哪个进程属于哪个用户。 ##### 3.在Linux中使用ps -ef命令查看所有正在运行的进程 除了ps -aux以外,您还可以使用-e命令列出所有正在运行的进程。通常的做法是将与“f”结合使用,以获得用于运行进程的命令的完整列表。 ``` ps -ef ``` 还可以加上“H”,显示所有的父进程以及其下的子进程一起: ``` ps -efH ``` ##### 4.查看特定用户的所有正在运行的进程 要获取有关特定用户运行的所有进程的信息,可以将“-U”选项与用户名一起使用: ``` ps -U user_name ``` 例如,我可以看到root用户正在运行的所有进程是这样的: ``` ps -U root PID TTY TIME CMD 1 ? 00:00:41 systemd 2 ? 00:00:00 kthreadd 3 ? 00:00:00 rcu_gp 4 ? 00:00:00 rcu_par_gp 8 ? 00:00:00 mm_percpu_wq 9 ? 00:00:03 ksoftirqd/0 10 ? 00:01:22 rcu_sched ``` ##### 5.查看小组运行的所有进程 您还可以通过按组名或组ID来对正在运行的进程进行分类: ``` ps -G group_name_or_id ``` 您可以与选项f结合使用以获取完整列表。 ##### 6.获取程序的所有出现次数和PID ps命令的基本用法之一是获取正在运行的程序的进程ID(PID)。通常,当要终止行为异常的程序时,将搜索该程序的所有实例,获取其PID并使用kill命令终止该过程。 ``` ps -C program__name ``` 例如,如果我必须找到apt软件包管理器的所有正在运行的实例: ``` ps -C apt PID TTY TIME CMD 11425 pts/1 00:00:00 apt ``` 您也可以[使用grep命令](https://linuxhandbook.com/grep-command-examples/)获得类似的结果。 ``` ps aux | grep program_name ``` ##### 7.获取有关PID的过程信息 好的!您有一个PID,但您不知道它属于哪个进程。您可以通过以下方式使用ps命令从其PID查找过程信息,N即PID: ``` ps -pN ``` 您可以通过使用逗号分隔多个PID,以使用多个PID: ``` ps -pN1,N2,N3 ``` ### grep 其实上面提到了一点,结合ps命令搜索进程,所以可以看出grep命令就像一个过滤器一样的作用,grep在文件中搜索匹配条件的内容,并显示包含该条件的所有行。 #### 基本用法 ``` [root@vultr ~]# grep --help Usage: grep [OPTION]... PATTERN [FILE]... Search for PATTERN in each FILE or standard input. PATTERN is, by default, a basic regular expression (BRE). Example: grep -i 'hello world' menu.h main.c ``` ``` $cat > geekfile.txt unix is great os. unix is opensource. unix is free os. learn operating system. Unix linux which one you choose. uNix is easy to learn.unix is a multiuser os.Learn unix .unix is a powerful. ``` **1.不区分大小写的搜索:** -i选项允许在给定文件中不区分大小写地搜索字符串。比如“ UNIX”,“ Unix”,“ unix”等词都可匹配。 ``` $grep -i "UNix" geekfile.txt ``` **Output:** ``` unix is great os. unix is opensource. unix is free os. Unix linux which one you choose. uNix is easy to learn.unix is a multiuser os.Learn unix .unix is a powerful. ``` **2. 显示与条件匹配的文件名** ``` $grep -l "unix" * or $grep -l "unix" f1.txt f2.txt f3.xt f4.txt ``` **Output:** ``` geekfile.txt ``` **3. 检查文件中的整个单词 :** 默认情况下,即使grep在文件中找到子字符串,它也只会匹配给定的字符串。 grep的-w选项使其仅匹配整个单词。 ``` $ grep -w "unix" geekfile.txt ``` **Output:** {% asset_img image-20200422105439799.png %} **4.使用grep -n在显示输出时显示行号:**要显示匹配行的文件的行号。 ``` $ grep -n "unix" geekfile.txt ``` **Output:** ``` 1:unix is great os. unix is opensource. unix is free os. 4:uNix is easy to learn.unix is a multiuser os.Learn unix .unix is a powerful. ``` **5.反转模式匹配:**您可以使用-v选项显示与指定搜索字符串模式不匹配的行。 ``` $ grep -v "unix" geekfile.txt ``` **Output:** ``` learn operating system. Unix linux which one you choose. ``` **6.匹配以字符串开头的行:** ^正则表达式模式指定行的开头。可以在grep中使用它来匹配以给定的字符串开头的行 ``` $ grep "^unix" geekfile.txt ``` **Output:** ``` unix is great os. unix is opensource. unix is free os. ``` **7.匹配以字符串结尾的行:**“ $”正则表达式模式指定行的结尾。可以在grep中使用它来匹配以给定字符串结尾的行。 ``` $ grep "os$" geekfile.txt ``` **Output:** ``` [root@vultr home]# grep "system.$" geekfile.txt learn operating system. ``` grep正则有兴趣的可以看下[regular-expression-grep](https://www.geeksforgeeks.org/regular-expression-grep/?ref=rp)。通常我是ps和grep结合在一起用,比如: ``` [root@vultr home]# ps -ef |grep -i "v2ray" root 1008 1 0 Apr17 ? 00:01:57 /usr/bin/v2ray/v2ray -config /etc/v2ray/config.json root 29435 28377 0 11:09 pts/0 00:00:00 grep --color=auto -i v2ray ``` #### 小结一下 | Linux grep command options | Description | | :------------------------- | :------------------------------- | | -i | 忽略大小写 | | -w | 强制PATTERN只匹配整个单词 | | -v | 反向匹配 | | -n | 输出匹配的行号 | | -h | 在输出中禁止Unix文件名前缀 | | -r | 在Linux上递归搜索目录 | | -R | 就像-r一样,但是遵循所有符号链接 | | -l | 仅打印具有选定行的文件名称称 | | -c | 每个文件仅打印选定行的数量 | | --color | 颜色显示匹配的内容 | ### top top命令提供系统信息的快速概述,它提供了正在运行的系统的动态实时视图,每3秒刷新一次(默认情况下)。 视图内容分为两部分: 1. 系统的摘要信息 2. 当前由Linux内核管理的进程或线程的列表。 一旦运行此命令,它将打开一个交互式命令模式,其中上半部分将包含进程和资源使用情况的统计信息。 下半部分包含当前正在运行的进程的列表。 按q会退出命令模式。 {% asset_img top.png %} ##### 上半部分 如图,在终端的顶部,我们获得了概览数据,包括当前任务数、内存使用率和cpu负载。 **第一行:任务队列信息**,同uptime命令的结果一样。 > 4:06:23 — 当前系统时间 > > up 4 days, 22:36 — 系统已经运行了4天22小时36分钟(在这期间系统没有重启过的吆!) > > 2 users — 当前有2个用户登录系统 > > load average: 0.00, 0.00, 0.00 — load average后面的三个数分别是1分钟、5分钟、15分钟的负载情况。例如,负载为1.0表示当前负荷为100%。 **load average**:平均负载部分表示一分钟,五分钟和十五分钟的平均“负载”,数据是每隔5秒钟检查一次活跃的进程数,然后按特定算法计算出的数值。。 “负载”是系统执行的计算工作量的度量。 在Linux上,负载是在任何给定时刻处于R和D状态的进程数。 “平均负载”值为您提供了一个等待时间,可以用来衡量您需要等待多长时间才能完成工作。 在多核系统上,您应该首先将平均负载除以CPU核数以得到类似的度量。 **第二行:Tasks — 任务(进程)** 系统进程也称为任务。进程可以以许多不同的方式运行,并使用各种算法确定优先级。 这有助于优化计算机执行任务的方式和时间。 ``` Tasks: 83 total, 1 running, 48 sleeping, 0 stopped, 0 zombie ``` 对状态进行简单的说明: | State | Description | | :------- | :----------------------------------------------------------- | | Running | 运行中/待处理(Active / in Queue to be Processed) | | Sleeping | 休眠(Waiting for a Process to Complete) | | Stopped | 停止(Interrupted by Job Control Signal ) | | Zombie | 僵尸进程(Made up of “Orphaned” Child Tasks / No Longer Running) | **第三行:cpu状态信息** ``` %Cpu(s): 0.3 us, 0.0 sy, 0.0 ni, 99.7 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st ``` CPU使用率部分显示了在各种任务上花费的CPU时间的百分比。 | Abbreviation | Description | | :----------- | :----------------------------------------------------------- | | us | CPU在用户空间(各个进程使用)中花费在执行进程上的时间 | | sy | 运行内核空间(内核使用)进程所花费的时间 | | ni | 优先级 | | id | CPU保持空闲的时间 | | wa | CPU等待I / O完成所花费的时间 | | hi | 处理硬件中断花费的时间(中断是向处理器发出有关需要立即关注的事件的信号) | | si | 处理软件中断花费的时间(中断是向处理器发出有关需要立即关注的事件的信号) | | st | CPU在虚拟机上花费的时间 | **第四行:内存状态信息** “内存”部分显示有关系统内存使用情况的信息。 标记为“ Mem”和“ Swap”的行分别显示有关RAM和交换空间的信息。 简而言之,交换空间是硬盘的一部分,就像RAM一样使用。 当RAM使用率接近满时,RAM的不常用区域将写入交换空间,以备以后需要时检索。 但是,由于访问磁盘的速度很慢,因此过多地依赖交换会损害系统性能。 ``` KiB Mem : 1006744 total, 200872 free, 146212 used, 659660 buff/cache KiB Swap: 0 total, 0 free, 0 used. 660908 avail Mem ``` “avail Mem”值是可以分配给进程而不会引起更多交换的内存量。 Linux内核还尝试以各种方式减少磁盘访问时间。 它在RAM中维护“磁盘缓存”,在RAM中存储磁盘的常用区域。 另外,磁盘写操作存储在“磁盘缓冲区”中,内核最终将其写出到磁盘。 它们消耗的总内存为“ buff / cache”值。缓存使用的内存将在需要时分配给进程。 ##### 下半部分 在终端的下部,我们有一个任务信息的表格,其中包含许多详细信息,先简单解释一下表头。 | Abbreviation | Description | | :----------- | :------------------------------------------------------ | | PID | 进程ID(唯一正整数) | | USER | 用户名 | | PR | 代表任务的优先级 | | NI | 代表任务的价值。 负值表示优先级较高,正值表示优先级较低 | | VIRT | 任务使用的虚拟内存 | | RES | 任务使用的物理内存 | | SHR | 任务使用的共享内存 | | S | 进程状态(正在运行,已停止等) | | %CPU | CPU 负载 | | %MEM | 物理内存/总内存的百分比 | | TIME + | 自启动以来该进程使用的总CPU时间,精确到百分之一秒 | | COMMAND | 进程名称 | ### 基本用法 #### **杀进程** 如果您想终止进程,只需在top运行时按“ k”。 这将弹出提示,提示您输入进程的进程ID,然后按Enter。 如下图中的:PID to signal/kill [default pid = 1] ``` Tasks: 81 total, 2 running, 46 sleeping, 0 stopped, 0 zombie %Cpu(s): 0.0 us, 0.3 sy, 0.0 ni, 99.7 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st KiB Mem : 1006744 total, 202708 free, 144288 used, 659748 buff/cache KiB Swap: 0 total, 0 free, 0 used. 662828 avail Mem PID to signal/kill [default pid = 1] ``` #### **进程列表排序** 使用诸如top之类的工具的最常见原因之一就是找出哪个进程消耗最多的资源。 您可以按以下键对列表进行排序(记住是**大写**哦): - “ M”按内存使用量排序 - “ P”按CPU使用率排序 - “ N”按进程ID排序 - “ T”按运行时间排序 默认情况下,top按降序显示所有结果。 但是,您可以通过按'R'切换到升序。 您也可以使用-o+表头的名称对列表进行排序。 例如,如果要按CPU使用率对进程进行排序,可以使用以下方法: ``` top -o %CPU ``` #### 查看线程 ``` top -H //出现的视图中的Tasks会变为Threads Threads: 103 total, 3 running, 68 sleeping, 0 stopped, 0 zombie ``` #### 显示完整路径(绝对路径) 默认情况下,top不显示程序的完整路径,也不区分内核空间进程和用户空间进程。 如果您需要此信息,请在top运行时按“ c”,再次按“ c”返回默认设置。内核空间进程周围带有方括号标记。 ``` 2036 root 20 0 158820 8852 7532 S 0.3 0.9 0:00.01 sshd: root [priv] 1 root 20 0 46124 8060 5616 S 0.0 0.8 0:15.58 /usr/lib/systemd/systemd --switched-root --system --deserialize 22 2 root 20 0 0 0 0 S 0.0 0.0 0:00.13 [kthreadd] 3 root 0 -20 0 0 0 I 0.0 0.0 0:00.00 [rcu_gp] 4 root 0 -20 0 0 0 I 0.0 0.0 0:00.00 [rcu_par_gp] ``` 或者运行以下命令 ``` top -c ``` #### 树状显示 如果希望查看进程的子级父级。 按“ V”。比如下图所示systemd为系统启动的第一个进程,该进程又创建了sshd等其它进程...。 ``` 1 root 20 0 46124 8060 5616 S 0.0 0.8 0:15.58 systemd 439 root 20 0 37204 3708 3396 S 0.0 0.4 2:00.59 `- systemd-journal 1012 root 20 0 258612 9696 8084 S 0.0 1.0 1:14.57 `- rsyslogd 1052 root 20 0 131160 2188 60 S 0.0 0.2 0:00.00 `- nginx 1053 nginx 20 0 132160 10100 7252 S 0.0 1.0 0:46.42 `- nginx 1265 root 20 0 89716 4836 3804 S 0.0 0.5 0:02.67 `- master 1268 postfix 20 0 89888 6600 5596 S 0.0 0.7 0:00.65 `- qmgr 1608 postfix 20 0 89820 6628 5624 S 0.0 0.7 0:00.01 `- pickup 13138 root 20 0 112936 7732 6708 S 0.0 0.8 0:16.48 `- sshd 28367 root 20 0 159228 10264 8572 S 0.0 1.0 0:03.73 `- sshd 28377 root 20 0 115464 3624 3208 S 0.0 0.4 0:00.13 `- bash 2053 root 20 0 161908 4444 3804 R 0.3 0.4 0:00.21 `- top ``` #### 列出指定用户的进程 要列出某个用户的进程,请在top运行时按“ u”。 或者用以下命令: ``` top -u root ``` #### 过滤进程 如果只想查看某些进程,可以使用top的过滤。 要激活此模式,请按“ o” /“ O”。 顶部会出现一个提示,您可以在此处键入过滤器表达式。如下图中的add filter #1 (ignoring case) as: [!]FLD?VAL ``` KiB Mem : 1006744 total, 198520 free, 147308 used, 660916 buff/cache KiB Swap: 0 total, 0 free, 0 used. 659616 avail Mem add filter #1 (ignoring case) as: [!]FLD?VAL PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 1 root 20 0 46124 8060 5616 S 0.0 0.8 0:15.74 systemd 2 root 20 0 0 0 0 S 0.0 0.0 0:00.13 kthreadd 3 root 0 -20 0 0 0 I 0.0 0.0 0:00.00 rcu_gp ``` 过滤器表达式是指定属性和值之间关系的语句。 过滤器的一些示例是: - COMMAND = getty:过滤在COMMAND属性中包含“ getty”的进程。 - !COMMAND = getty:过滤在COMMAND属性中没有“ getty”的进程。 - %CPU> 3.0:筛选CPU利用率超过3%的进程。 添加过滤器后,您可以通过添加更多过滤器来进一步简化操作。 要清除添加的所有过滤器,请按“ =”。 #### 更改CPU和内存统计信息的默认外观 如果觉得top显示CPU和内存统计信息的默认方式不喜欢。 可以按“ t”和“ m”来更改CPU和内存统计信息的样式。 {% asset_img top1.png %} #### 保存设置 如果您对top的输出进行了任何更改,则可以按“ W”将其保存以备后用。 top将其配置写入主目录中的.toprc文件。 #### 感谢 {% blockquote top1 http://man7.org/linux/man-pages/man1/top.1.html man7.org %} {% endblockquote %} {% blockquote grep-command-in-unixlinux https://www.geeksforgeeks.org/grep-command-in-unixlinux geeksforgeeks %} {% endblockquote %} {% blockquote howto-use-grep-command-in-linux-unix https://www.cyberciti.biz/faq/howto-use-grep-command-in-linux-unix/ Vivek Gite %} {% endblockquote %} {% blockquote guide-linux-top-command https://www.booleanworld.com/guide-linux-top-command/ SUPRIYO BISWAS %} {% endblockquote %}