查看进程: ps

ps命令用于报告当前系统的进程状态。可以搭配kill指令随时中断、删除不必要的程序。ps命令是最基本同时也是非常强大的进程查看命令,使用该命令可以确定有哪些进程正在运行和运行的状态、进程是否结束、进程有没有僵死、哪些进程占用了过多的资源等等,总之大部分信息都是可以通过执行该命令得到的,格式为 ps [参数]

ps命令的参数以及作用:

参数 作用
-a 显示所有进程(包括其他用户的进程)
-u 用户以及其他详细信息
-x 显示没有控制终端的进程

输出格式:

  • l :较长、较详细的将该PID 的的信息列出;
  • j :工作的格式 (jobs format)
  • -f :做一个更为完整的输出。

Linux系统中时刻运行着许多进程,如果能够合理地管理它们,则可以优化系统的性能。在Linux系统中,有5种常见的进程状态,分别为运行、中断、不可中断、僵死与停止,其各自含义如下所示。

  • R(运行):进程正在运行或在运行队列中等待。
  • S(中断):进程处于休眠中,当某个条件形成后或者接收到信号时,则脱离该 状态。
  • D(不可中断):进程不响应系统异步信号,即便用kill命令也不能将其中断。
  • Z(僵死):进程已经终止,但进程描述符依然存在, 直到父进程调用wait4()系统函数后将进程释放。
  • T(停止):进程收到停止信号后停止运行。

查看进程信息

  1. [admin@sshk1 ~]$ ps -al
  2. F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD
  3. 4 S 0 12086 11995 0 80 0 - 48077 do_wai pts/0 00:00:00 su
  4. 4 S 0 12099 12086 0 80 0 - 28882 do_wai pts/0 00:00:00 bash
  5. 0 S 1000 19693 19659 0 80 0 - 43992 poll_s pts/1 00:00:00 ssh
  6. 4 T 0 21923 12099 0 80 0 - 35493 do_sig pts/0 00:00:00 kubectl
  7. 0 S 1000 24169 20708 0 80 0 - 43992 poll_s pts/2 00:00:00 ssh
  8. 4 S 0 25275 12099 0 80 0 - 35493 futex_ pts/0 00:00:00 kubectl
  9. 0 R 1000 26137 24388 0 80 0 - 37235 - pts/3 00:00:00 ps

各相关信息的意义为:

  • F 代表这个程序的旗标 (flag), 4 代表使用者为 superuser;
  • S 代表这个程序的状态 (STAT);
  • UID 代表执行者身份
  • PID 进程的ID号!
  • PPID 父进程的ID;
  • C CPU使用的资源百分比
  • PRI指进程的执行优先权(Priority的简写),其值越小越早被执行;
  • NI 这个进程的nice值,其表示进程可被执行的优先级的修正数值。
  • ADDR 这个是内核函数,指出该程序在内存的那个部分。如果是个执行 的程序,一般就是『 - 』
  • SZ 使用掉的内存大小;
  • WCHAN 目前这个程序是否正在运作当中,若为 - 表示正在运作;
  • TTY 登入者的终端机位置;
  • TIME 使用掉的 CPU 时间。
  • CMD 所下达的指令名称

列出目前所有的正在内存当中的程序

  1. [admin@sshk1 ~]$ ps aux
  2. USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
  3. root 1 0.0 0.0 191068 3532 ? Ss Nov15 1:11 /usr/lib/systemd/systemd --system --deserialize 20
  4. root 2 0.0 0.0 0 0 ? S Nov15 0:00 [kthreadd]

各相关信息的意义为:

  • USER:该进程属于那个使用者账号。
  • PID :该进程的进程ID号。
  • %CPU:该进程使用掉的 CPU 资源百分比;
  • %MEM:该进程所占用的物理内存百分比;
  • VSZ :该进程使用掉的虚拟内存量 (Kbytes)
  • RSS :该进程占用的固定的内存量 (Kbytes)
  • TTY :该进程是在那个终端机上面运作,若与终端机无关,则显示 ?。另外, tty1-tty6 是本机上面的登入者程序,若为 pts/0 等等的,则表示为由网络连接进主机的程序。
  • STAT:该程序目前的状态
  • START:该进程被触发启动的时间;
  • TIME :该进程实际使用 CPU 运作的时间。
  • COMMAND:该程序的实际指令。

优化显示输出

通常可以配合管道符或重定向到文件:

  1. ps -aux | more
  2. ps -aux > psInfo.txt

可以使用 -o 选项输出指定字段:

  1. ps -o pid,ppid,pgrp,session,tpgid,comm

根据某个字段排序:

  1. ps -aux --sort -pcpu | less # 根据 CPU 使用来升序排序
  2. ps -aux --sort -pmem | less # 根据 内存使用 来升序排序

使用 pstree 命令树形显示进程:

  1. [admin@sshk1 ~]$ pstree
  2. systemd─┬─AliYunDun───19*[{AliYunDun}]
  3. ├─dockerd─┬─docker-containe─┬─7*[docker-containe─┬─pause]
  4. └─9*[{docker-containe}]]
  5. ├─docker-containe─┬─pause
  6. └─11*[{docker-containe}]
  7. ├─docker-containe─┬─etcd───11*[{etcd}]
  8. └─10*[{docker-containe}]
  9. └─31*[{docker-containe}]
  10. └─19*[{dockerd}]

查看特定用户进程:

  1. ps -u admin

通过进程名过滤:

  1. ps -C bash

显示所有进程信息:

  1. ps -ef

结束进程: kill

kill命令用来删除执行中的程序或工作。kill可将指定的信息送至程序。预设的信息为SIGTERM(15),可将指定程序终止。若仍无法终止该程序,可使用SIGKILL(9)信息尝试强制删除程序。程序或工作的编号可利用ps指令或job指令查看。

通过 kill -l 列出所有信号名称:

  1. $ kill -l
  2. 1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL
  3. 2) SIGTRAP 6) SIGABRT 7) SIGBUS 8) SIGFPE
  4. 3) SIGKILL 10) SIGUSR1 11) SIGSEGV 12) SIGUSR2
  5. 1) SIGPIPE 14) SIGALRM 15) SIGTERM 16) SIGSTKFLT
  6. 2) SIGCHLD 18) SIGCONT 19) SIGSTOP 20) SIGTSTP
  7. 3) SIGTTIN 22) SIGTTOU 23) SIGURG 24) SIGXCPU
  8. 4) SIGXFSZ 26) SIGVTALRM 27) SIGPROF 28) SIGWINCH
  9. 5) SIGIO 30) SIGPWR 31) SIGSYS 34) SIGRTMIN
  10. 6) SIGRTMIN+1 36) SIGRTMIN+2 37) SIGRTMIN+3 38) SIGRTMIN+4
  11. 7) SIGRTMIN+5 40) SIGRTMIN+6 41) SIGRTMIN+7 42) SIGRTMIN+8
  12. 8) SIGRTMIN+9 44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12
  13. 9) SIGRTMIN+13 48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14
  14. 10) SIGRTMAX-13 52) SIGRTMAX-12 53) SIGRTMAX-11 54) SIGRTMAX-10
  15. 11) SIGRTMAX-9 56) SIGRTMAX-8 57) SIGRTMAX-7 58) SIGRTMAX-6
  16. 12) SIGRTMAX-5 60) SIGRTMAX-4 61) SIGRTMAX-3 62) SIGRTMAX-2
  17. 13) SIGRTMAX-1 64) SIGRTMAX

只有第9种信号(SIGKILL)才可以无条件终止进程,其他信号进程都有权利忽略,下面是常用的信号:

  1. HUP 1 终端断线
  2. INT 2 中断(同 Ctrl + C
  3. QUIT 3 退出(同 Ctrl + \)
  4. TERM 15 终止
  5. KILL 9 强制终止
  6. CONT 18 继续(与STOP相反, fg/bg命令)
  7. STOP 19 暂停(同 Ctrl + Z

举例: 先用ps查找进程,然后用kill杀掉:

$ ps -ef | grep vim
root      3268  2884  0 16:21 pts/1    00:00:00 vim install.log
root      3370  2822  0 16:21 pts/0    00:00:00 grep vim

kill 3268
$ kill 3268
-bash: kill: (3268) - 没有那个进程

结束进程: killall

killall命令使用进程的名称来杀死进程,使用此指令可以杀死一组同名进程。我们可以使用kill命令杀死指定进程PID的进程,如果要找到我们需要杀死的进程,我们还需要在之前使用ps等命令再配合grep来查找进程,而killall把这两个过程合二为一,是一个很好用的命令。

参数列表:

-e:对长名称进行精确匹配;
-l:忽略大小写的不同;
-p:杀死进程所属的进程组;
-i:交互式杀死进程,杀死进程前需要进行确认;
-l:打印所有已知信号列表;
-q:如果没有进程被杀死。则不输出任何信息;
-r:使用正规表达式匹配要杀死的进程名称;
-s:用指定的进程号代替默认信号“SIGTERM”;
-u:杀死指定用户的进程。

杀死所有同名进程:

killall vi

结束进程: pkill

pkill命令可以按照进程名杀死进程。pkill和killall应用方法差不多,也是直接杀死运行中的程序。

$ pgrep -l java
4514 java
4594 java
9263 java
19715 java
19846 java
19954 java
20347 java
pkill java

查看系统资源分配: top

top命令是Linux下常用的性能分析工具,能够实时显示系统中各个进程的资源占用状况,类似于Windows的任务管理器。

top是一个动态显示过程,即可以通过用户按键来不断刷新当前状态.如果在前台执行该命令,它将独占前台,直到用户终止该程序为止.比较准确的说,top命令提供了实时的对系统处理器的状态监视.它将显示系统中CPU最“敏感”的任务列表.该命令可以按CPU使用.内存使用和执行时间对任务进行排序;而且该命令的很多特性都可以通过交互式命令或者在个人定制文件中进行设定.

显示参数含义

Tasks

  • total 进程总数
  • running 正在运行的进程数
  • sleeping 睡眠的进程数
  • stopped 停止的进程数
  • zombie 僵尸进程数

Cpu(s)

  • 0.3% us 用户空间占用CPU百分比
  • 1.0% sy 内核空间占用CPU百分比
  • 0.0% ni 用户进程空间内改变过优先级的进程占用CPU百分比
  • 98.7% id 空闲CPU百分比
  • 0.0% wa 等待输入输出的CPU时间百分比
  • 0.0%hi:硬件CPU中断占用百分比
  • 0.0%si:软中断占用百分比
  • 0.0%st:虚拟机占用百分比

Mem

  • 191272k total 物理内存总量
  • 173656k used 使用的物理内存总量
  • 17616k free 空闲内存总量
  • 22052k buffers 用作内核缓存的内存量

Swap

  • 192772k total 交换区总量
  • 0k used 使用的交换区总量
  • 192772k free 空闲交换区总量
  • 123988k cached 缓冲的交换区总量,内存中的内容被换出到交换区,而后又被换入到内存,但使用过的交换区尚未被覆盖,该数值即为这些内容已存在于内存中的交换区的大小,相应的内存再次被换出时可不必再对交换区写入。

进程信息区

序号  列名    含义
a    PID     进程id
b    PPID    父进程id
c    RUSER   Real user name
d    UID     进程所有者的用户id
e    USER    进程所有者的用户名
f    GROUP   进程所有者的组名
g    TTY     启动进程的终端名。不是从终端启动的进程则显示为 ?
h    PR      优先级
i    NI      nice值。负值表示高优先级,正值表示低优先级
j    P       最后使用的CPU,仅在多CPU环境下有意义
k    %CPU    上次更新到现在的CPU时间占用百分比
l    TIME    进程使用的CPU时间总计,单位秒
m    TIME+   进程使用的CPU时间总计,单位1/100秒
n    %MEM    进程使用的物理内存百分比
o    VIRT    进程使用的虚拟内存总量,单位kb。VIRT=SWAP+RES
p    SWAP    进程使用的虚拟内存中,被换出的大小,单位kb。
q    RES     进程使用的、未被换出的物理内存大小,单位kb。RES=CODE+DATA
r    CODE    可执行代码占用的物理内存大小,单位kb
s    DATA    可执行代码以外的部分(数据段+栈)占用的物理内存大小,单位kb
t    SHR     共享内存大小,单位kb
u    nFLT    页面错误次数
v    nDRT    最后一次写入到现在,被修改过的页面数。
w    S       进程状态(D=不可中断的睡眠状态,R=运行,S=睡眠,T=跟踪/停止,Z=僵尸进程)
x    COMMAND 命令名/命令行
y    WCHAN   若该进程在睡眠,则显示睡眠中的系统函数名
z    Flags   任务标志,参考 sched.h

默认情况下仅显示比较重要的 PID、USER、PR、NI、VIRT、RES、SHR、S、%CPU、%MEM、TIME+、COMMAND 列。

快捷键

  • f - 更改显示内容
  • P - 以 CPU 占用率大小的顺序排列进程列表
  • M - 以内存占用率大小的顺序排列进程列表