32.系统进程和进程管理-ps+uptime+top+lsof+pstree+kill+nice

系统进程和进程管理

什么是进程

进程是已启动的可执行程序的运行实例,进程有以下注册部分:

  1. 已分配内存的地址空间
  2. 安全属性,包括所有权凭证和特权凭证
  3. 程序代码的一个或多个执行线程
  4. 进程状态

 

程序是二进制文件。

进程是程序运行的过程,是动态的,是有生命周期的,是由运行状态的。

 

进程的生命周期

 

 

 

 

父进程复制自己的地址空间(fork  [fɔ:k] 分叉)创建一个新的(子)进程结构。每个新进程分配一个唯一的进程 ID (PID),满足跟踪安全性之需。PID 和 父进程 ID (PPID)是子进程环境的元素,任何进程都可以创建子进程,所有进程都是第一个系统进程的后代。

 

centos5/centos6:PID为1的进程是init

centos7:PID为1的进程是systemd

 

僵尸进程:

一个进程使用fork创建子进程,如果子进程退出,而父进程并没有调用waitwaitpid获取子进程的状态信息,那么子进程的进程描述符仍然保存在系统中。这种进程称之为僵尸进程。

就是父进程退出了, 子进程没有退出, 那么这些子进程就没有父进程来管理了,就变成僵尸进程。

 

进程的属性有哪些

进程ID(PID):是唯一的数值,用来区分进程

父进程的ID(PPID)

启动进程的用户ID(UID)和所归属的组(GID)

进程状态:状态分为运行R、休眠S、僵尸Z

进程执行的优先级

进程所连接的终端名

进程资源占用:比如占用资源大小(内存、CPU占用量)

 

ps查看进程工具

语法:ps [参数] 进程

参数:

a:显示跟当前终端关联的所有进程

u:基于用户的进程格式显示,

U:显示某用户ID的所有进程

x:显示所有进程,不以终端来区分

 

ps –aux | more

查看所有进程

注:最后一列[xxxx] 使用方括号括起来的进程是内核态的进程。没有括起来的是用户态进程。

[root@bogon Desktop]# ps -aux | more

USER        PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND

root          1  0.0  0.0 191504  4536 ?        Ss   Dec04   0:21 /usr/lib/syste

md/systemd --switched-root --system --deserialize 22

root          2  0.0  0.0      0     0 ?        S    Dec04   0:00 [kthreadd]

root          3  0.0  0.0      0     0 ?        S    Dec04   0:00 [ksoftirqd/0]

root          5  0.0  0.0      0     0 ?        S<   Dec04   0:00 [kworker/0:0H]

root          7  0.0  0.0      0     0 ?        S    Dec04   0:00 [migration/0]

root          8  0.0  0.0      0     0 ?        S    Dec04   0:00 [rcu_bh]

root          9  0.0  0.0      0     0 ?        S    Dec04   0:15 [rcu_sched]

root         10  0.0  0.0      0     0 ?        S<   Dec04   0:00 [lru-add-drain

]

root         11  0.0  0.0      0     0 ?        S    Dec04   0:00 [watchdog/0]

root         12  0.0  0.0      0     0 ?        S    Dec04   0:00 [watchdog/1]

root         13  0.0  0.0      0     0 ?        S    Dec04   0:00 [migration/1]

root         14  0.0  0.0      0     0 ?        S    Dec04   0:00 [ksoftirqd/1]

root         16  0.0  0.0      0     0 ?        S<   Dec04   0:00 [kworker/1:0H]

root         17  0.0  0.0      0     0 ?        S    Dec04   0:00 [watchdog/2]

root         18  0.0  0.0      0     0 ?        S    Dec04   0:00 [migration/2]

root         19  0.0  0.0      0     0 ?        S    Dec04   0:00 [ksoftirqd/2]

root         21  0.0  0.0      0     0 ?        S<   Dec04   0:00 [kworker/2:0H]

root         22  0.0  0.0      0     0 ?        S    Dec04   0:00 [watchdog/3]

root         23  0.0  0.0      0     0 ?        S    Dec04   0:00 [migration/3]

 

进程中参数解释

USER: 启动这些进程的用户

PID: 进程的ID

%CPU 进程占用的CPU百分比; 
%MEM 占用内存的百分比; 

VSZ:进程占用的虚拟内存大小(单位:KB) 
RSS:进程占用的物理内存大小(单位:KB) 

STAT:该程序目前的状态,Linux进程有5种基本状态:

R :该程序目前正在运作,或者是可被运作;

S :该程序目前正在睡眠当中 (可说是 idle 状态啦!),但可被某些讯号(signal) 唤醒。

T :该程序目前正在侦测或者是停止了;

:该程序应该已经终止,但是其父程序却无法正常的终止他,造成 zombie (疆尸) 程序的状态

D :不可中断状态.

<: 表示进程运行在高优先级上

N: 表示进程运行在低优先级上

L: 表示进程有页面锁定在内存中

s: 表示进程是控制进程

l: 表示进程是多线程的

+: 表示当前进程运行在前台

START:该 process 被触发启动的时间;

TIME :该 process 实际使用 CPU 运作的时间。

COMMAND:该程序的实际指令

 

ps –aux | grep进程名

查看某个进程的状态

[root@bogon ~]# ps -aux | grep a.txt

root      42383  0.1  0.0 149304  5160 pts/0    S+   00:52   0:00 vim a.txt

root      42450  0.0  0.0 112708   984 pts/2    S+   00:53   0:00 grep --color=auto a.txt

 

常用快捷键

Ctrl + C:发送SIGINT信号,终止一个进程

Ctrl + Z:发送SIGSTOP信号,挂起一个进程,将任务放置在后台(暂停进程)

Ctrl + D:表示一个特殊的二进制(EOF),代表输入完成或注销

 

ps –ef

-e:显示所有进程

-f:显示完整格式输出

举例:

显示所有进程并按照完整格式输出

[root@bogon ~]# ps -ef

UID         PID   PPID  C STIME TTY          TIME CMD

root          1      0  0 Dec04 ?        00:00:21 /usr/lib/systemd/systemd --swi

root          2      0  0 Dec04 ?        00:00:00 [kthreadd]

root          3      2  0 Dec04 ?        00:00:00 [ksoftirqd/0]

root          5      2  0 Dec04 ?        00:00:00 [kworker/0:0H]

root          7      2  0 Dec04 ?        00:00:00 [migration/0]

root          8      2  0 Dec04 ?        00:00:00 [rcu_bh]

 

进程中参数解释

UID: 启动这些进程的用户

PID: 进程的ID

PPID: 父进程的进程号

C: 进程生命周期中的CPU利用率

STIME: 进程启动时的系统时间

TTY: 表明进程在哪个终端设备上运行。如果显示  ?表示与终端无关,这种进程一般是内核态进程。另外, tty1-tty6 是本机上面的登入者程序,若为 pts/0 等,则表示运行在虚拟终端上的进程。

TIME: 运行进程一共累计占用的CPU时间

CMD: 启动的程序名称

 

ps –ef | grep 进程名

查看某个进程的状态

[root@bogon ~]# ps -ef | grep a.txt

root      42383  23328  0 00:52 pts/0    00:00:00 vim a.txt

root      42954  42389  0 01:01 pts/2    00:00:00 grep --color=auto a.txt

 

ps –aux 与ps –ef对比

ps –aux:是用BSD的格式来显示进程。

ps –ef:是用标准的格式显示进程。

 

uptime查看CPU负载工具

[root@bogon ~]# uptime

 01:03:17 up 19:02,  4 users,  load average: 0.00, 0.01, 0.05

 

显示信息的解释

13:22:30

当前时间

up 20days

系统运行时间,说明此服务器连续运行20天了

2 user

当前登录用户数

load average: 0.06, 0.60, 0.48

系统负载,即任务队列的平均长度。 三个数值分别为  1分钟、5分钟、15分钟前到现在的平均值。

 

计算CPU是否负载过高

如果服务器的CPU为1核心,则load average中的数字>=3则负载过高;

如果服务器的CPU为4核心,则load average中的数字>=12则负载过高。

 

top命令

[root@bogon ~]# top

top - 01:07:54 up 19:07,  4 users,  load average: 0.00, 0.01, 0.05

Tasks: 259 total,   1 running, 258 sleeping,   0 stopped,   0 zombie

%Cpu(s):  0.0 us,  0.1 sy,  0.0 ni, 99.8 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st

KiB Mem :  7990280 total,  6093700 free,   846664 used,  1049916 buff/cache

KiB Swap:  5242876 total,  5242876 free,        0 used.  6736400 avail Mem

 

 PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND   

  8961 root      20   0  320028   6764   5272 S   0.3  0.1   1:56.38 vmtoolsd  

  8985 root      20   0   21680   1308    988 S   0.3  0.0   0:11.27 irqbalance

 43326 root      20   0  162132   2404   1592 R   0.3  0.0   0:00.06 top       

     1 root      20   0  191504   4536   2636 S   0.0  0.1   0:21.93 systemd   

     2 root      20   0       0      0      0 S   0.0  0.0   0:00.07 kthreadd  

     3 root      20   0       0      0      0 S   0.0  0.0   0:00.11 ksoftirqd+

     5 root       0 -20       0      0      0 S   0.0  0.0   0:00.00 kworker/0+

     7 root      rt   0       0      0      0 S   0.0  0.0   0:00.07 migration+

     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:16.22 rcu_sched 

    10 root       0 -20       0      0      0 S   0.0  0.0   0:00.00 lru-add-d+

    11 root      rt   0       0      0      0 S   0.0  0.0   0:00.59 watchdog/0

    12 root      rt   0       0      0      0 S   0.0  0.0   0:00.50 watchdog/1

    13 root      rt   0       0      0      0 S   0.0  0.0   0:00.26 migration+

    14 root      20   0       0      0      0 S   0.0  0.0   0:00.25 ksoftirqd+

16 root       0 -20       0      0      0 S   0.0  0.0   0:00.00 kworker/1+

 

显示信息解释

第一行

top - 01:07:54 up 19:07,  4 users,  load average: 0.00, 0.01, 0.05

表示:

13:22:30

当前时间

up 20days

系统运行时间,说明此服务器连续运行20天了

2 user

当前登录用户数

load average: 0.06, 0.60, 0.48

系统负载,即任务队列的平均长度。 三个数值分别为  1分钟、5分钟、15分钟前到现在的平均值。

 

第二、第三行

Tasks: 259 total,   1 running, 258 sleeping,   0 stopped,   0 zombie

%Cpu(s):  0.0 us,  0.1 sy,  0.0 ni, 99.8 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st

当有多个CPU时,这些内容可能会超过两行。

表示:

Tasks: 481 total

进程总数

1 running

正在运行的进程数

480 sleeping

睡眠的进程数

0 stopped

停止的进程数

0 zombie

僵尸进程数

Cpu(s): 0.0% us

系统用户进程使用CPU百分比。

0.0% sy

内核中的进程占用CPU百分比

0.0% ni

用户进程空间内改变过优先级的进程占用CPU百分比

98.7% id

空闲CPU百分比

0.0% wa

cpu等待I/0完成的时间总量。

测试:

终端1:执行:top

终端2dd if=/dev/zero of=/a.txt count=10 bs=100M

终端3dd if=/dev/zero of=/a.txt count=10 bs=100M

如下:

 

 

0.0% hi(了解)

硬中断消耗时间

 

硬中断,占的CPU百分比。1. 硬中断是由硬件产生的,比如,像磁盘,网卡,键盘,时钟等。每个设备或设备集都有它自己的IRQ(中断请求)。基于IRQCPU可以将相应的请求分发到对应的硬件驱动上(注:硬件驱动通常是内核中的一个子程序,而不是一个独立的进程)。# hi -> Hardware IRQ: The amount of time the CPU has been servicing hardware interrupts.

0.0% si(了解)

软中断消耗时间

软中断,占的CPU百分比。1. 通常,软中断是一些对I/O的请求。这些请求会调用内核中可以调度I/O发生的程序。对于某些设备,I/O请求需要被立即处理,而磁盘I/O请求通常可以排队并且可以稍后处理。根据I/O模型的不同,进程或许会被挂起直到I/O完成,此时内核调度器就会选择另一个进程去运行。I/O可以在进程之间产生并且调度过程通常和磁盘I/O的方式是相同。# si -> Software Interrupts.: The amount of time the CPU has been servicingsoftware interrupts.

0.0 st steal 偷)

st:虚拟机偷取物理的时间。比如:物理机已经运行了KVMXEN虚拟机。KVM虚拟机占用物理机的cpu时间

 

第四、第五行

KiB Mem :  7990280 total,  6093700 free,   846664 used,  1049916 buff/cache

KiB Swap:  5242876 total,  5242876 free,        0 used.  6736400 avail Mem

Mem: 2033552k total

物理内存总量

340392k used

使用的物理内存总量

1376636k free

空闲内存总量

316524k buff/cache

用作内核缓存的内存量。

free -k 一个意思

 

 

 

 

 

Swap: 2017948k total

交换区总量

0k used

使用的交换区总量

192772k free

空闲交换区总量

1518148 avail Mem

总的可利用内存是多少

 

第六行

PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND

列名

含义

PID

进程id

USER

进程所有者的用户名

PR

优先级(由内核动态调整),用户不能

NI

进程优先级。 nice值。负值表示高优先级,正值表示低优先级,用户可以自己调整

VIRTvirtual memory usage

虚拟内存,是进程正在使用的所有内存(ps中标为VSZ

VIRTvirtual memory usage 虚拟内存

1、进程“需要的”虚拟内存大小,包括进程使用的库、代码、数据等

2、假如进程申请100m的内存,但实际只使用了10m,那么它会增长100m,而不是实际的使用量

RESresident memory usage

是进程所使用的物理内存。实际实用内存(ps中标为RSS

RESresident memory usage 常驻内存

1、进程当前使用的内存大小,但不包括swap out

2、包含其他进程的共享

3、如果申请100m的内存,实际使用10m,它只增长10m,与VIRT相反

4、关于库占用内存的情况,它只统计加载的库文件所占内存大小

SHR

共享内存大小,单位kb

SHRshared memory 共享内存

1、除M了自身进程的共享内存,也包括其他进程的共享内存

2、虽然进程只使用了几个共享库的函数,但它包含了整个共享库的大小

3、计算某个进程所占的物理内存大小公式:RES SHR

4swap out后,它将会降下来

S

进程状态。
            D=
不可中断的睡眠状态
            R=
运行中或可运行
            S=
睡眠中
            T=
已跟踪/已停止
            Z=
僵停

%CPU

上次更新到现在的CPU时间占用百分比

%MEM

进程使用的物理内存百分比

TIME+

进程使用的CPU时间总计,单位1/100

COMMAND

命令名/命令行

 

top快捷键

按空格:立即刷新。

q:退出

P:按CPU排序

M:按内存排序

T:按时间排序

p: 进程IP,查看某个进程状态

数字键1:显示每个内核的CPU使用率

u/U:指定显示的用户

h:帮助

 

使用top只查看某个或某些进程信息

先使用“ps –aux | grep 进程”查找到该进程的ID

[root@bogon ~]# ps -aux | grep vim

root      42383  0.0  0.0 149304  5160 pts/0    S+   00:52   0:00 vim a.txt

root      44014  0.0  0.0 112712   972 pts/2    S+   01:19   0:00 grep --color=auto vim

 

然后使用“top –p ID号”查看该进程的动态信息

[root@bogon ~]# top -p 42383

top - 01:20:09 up 19:19,  4 users,  load average: 0.00, 0.01, 0.05

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 :  7990280 total,  6093388 free,   846772 used,  1050120 buff/cache

KiB Swap:  5242876 total,  5242876 free,        0 used.  6736076 avail Mem

 

   PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND   

 42383 root      20   0  149304   5160   2572 S   0.0  0.1   0:00.02 vim  

 

lsof命令

语法:lsof [参数] 端口/进程ID

参数:

-i:列出符合条件的进程(进程:协议、:端口号、@IP地址)

-p:列出指定进程号

 

lsof –i :端口号

列出包含该端口的所以进程信息

[root@bogon ~]# lsof -i :22

COMMAND   PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME

sshd     9349 root    3u  IPv4  51785      0t0  TCP *:ssh (LISTEN)

sshd     9349 root    4u  IPv6  51787      0t0  TCP *:ssh (LISTEN)

sshd    23305 root    3u  IPv4 179294      0t0  TCP bogon:ssh->bogon:63693 (ESTABLISHED)

 

lsof –p 进程ID

列出含有该进程ID的所有进程

[root@bogon ~]# lsof -p 42383

COMMAND   PID USER   FD   TYPE DEVICE  SIZE/OFF      NODE NAME

vim     42383 root  cwd    DIR    8,3       106  67164794 /root/Desktop

vim     42383 root  rtd    DIR    8,3       277        64 /

vim     42383 root  txt    REG    8,3   2294216 102026522 /usr/bin/vim

 

pstree工具

pstree以树状图显示进程,只显示进程的名字。相同进程将会合并显示。

pstree

[root@bogon ~]# pstree

systemd─┬─ModemManager───2*[{ModemManager}]

        ├─NetworkManager─┬─dhclient

        │                └─2*[{NetworkManager}]

        ├─VGAuthService

        ├─2*[abrt-watch-log]

        ├─abrtd

        ├─accounts-daemon───2*[{accounts-daemon}]

        ├─alsactl

        ├─at-spi-bus-laun─┬─dbus-daemon

        │                 └─3*[{at-spi-bus-laun}]

        ├─at-spi2-registr───2*[{at-spi2-registr}]

        ├─atd

        ├─auditd─┬─audispd─┬─sedispatch

 

pstree –p

[root@bogon ~]# pstree -p

systemd(1)─┬─ModemManager(8980)─┬─{ModemManager}(9034)

           │                    └─{ModemManager}(9041)

           ├─NetworkManager(8984)─┬─dhclient(38080)

           │                      ├─{NetworkManager}(9057)

           │                      └─{NetworkManager}(9061)

 

前后台进程的切换

Linux后台进程与前台进程的区别

前台进程:

是在终端中运行的命令,那么该终端就为进程的控制终端,一旦这个终端关闭,这个进程也随着消失。

后台进程:

也叫守护进程(Daemon),是运行在后台的一种特殊进程,不受终端控制,它不需要与终端交互。

 

系统任务相关命令

&

用在一个命令的最后,可以把这个命令放到后台执行.

ctrl + z

 将一个正在前台执行的命令放到后台,并且暂停.

jobs

查看当前有多少在后台运行的进程.它是一个作业控制命令

Fg(foreground process)

 将后台中的命令调至前台继续运行, 如果后台中有多个命令,可以用 fg %jobnumber将选中的命令调出,%jobnumber是通过jobs命令查到的后台正在执行的命令的序号(不是pid)  

bg(background process)

将一个在后台暂停的命令,变成继续执行; 如果后台中有多个命令,可以用bg %jobnumber将选中的命令调出,%jobnumber是通过jobs命令查到的后台正在执行的命令的序号(不是pid)

 

命令举例:

[root@bogon ~]# jobs

[root@bogon ~]# fg 1

 

kill关闭进程

关闭进程有3个命令,可以通过这3个命令实现关闭进程。

kill –l

列出所有支持的信号,用的最多的是9(SIGKILL)信号

[root@bogon ~]# kill -l

 1) SIGHUP       2) SIGINT       3) SIGQUIT      4) SIGILL       5) SIGTRAP

 6) SIGABRT      7) SIGBUS       8) SIGFPE       9) SIGKILL     10) SIGUSR1

11) SIGSEGV     12) SIGUSR2     13) SIGPIPE     14) SIGALRM     15) SIGTERM

16) SIGSTKFLT   17) SIGCHLD     18) SIGCONT     19) SIGSTOP     20) SIGTSTP

21) SIGTTIN     22) SIGTTOU     23) SIGURG      24) SIGXCPU     25) SIGXFSZ

26) SIGVTALRM   27) SIGPROF     28) SIGWINCH    29) SIGIO       30) SIGPWR

31) SIGSYS      34) SIGRTMIN    35) SIGRTMIN+1  36) SIGRTMIN+2  37) SIGRTMIN+3

38) SIGRTMIN+4  39) SIGRTMIN+5  40) SIGRTMIN+6  41) SIGRTMIN+7  42) SIGRTMIN+8

43) SIGRTMIN+9  44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12 47) SIGRTMIN+13

48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14 51) SIGRTMAX-13 52) SIGRTMAX-12

53) SIGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-9  56) SIGRTMAX-8  57) SIGRTMAX-7

58) SIGRTMAX-6  59) SIGRTMAX-5  60) SIGRTMAX-4  61) SIGRTMAX-3  62) SIGRTMAX-2

63) SIGRTMAX-1  64) SIGRTMAX

 

常用信号解释

1) SIGHUP     重新加载配置

2) SIGINT      键盘中断  crtl+c

3)  SIGQUIT     退出

9) SIGKILL      强制终止

15)SIGTERM    终止(正常结束),缺省信号

18)SIGCONT    继续

19)SIGSTOP     停止

20)SIGTSTP     暂停 crtl+z

 

kill -9 进程ID

终止某个进程

[root@bogon ~]# kill -9 45516

 

killall 进程名

[root@bogon ~]# killall vim

pkill 进程名

[root@bogon ~]# pkill vim

 

nice进程优先管理

进程的优先级取值范围是(-2-到19),值越小优先级越高,默认优先级是0.

 

nice –n 数值 进程

指定程序的运行优先级

[root@localhost Desktop]# nice -n 5 vim a.sh

 

[1]+  Stopped                 nice -n 5 vim a.sh

[root@localhost ~]# ps -aux | grep vim

root      46776  0.2  0.0 149456  5428 pts/2    TN   14:32   0:00 vim a.sh

root      46810  0.0  0.0 112708   972 pts/0    S+   14:33   0:00 grep --color=auto vim

[root@localhost ~]# top -p 46776

top - 14:33:29 up 19:59,  4 users,  load average: 0.01, 0.11, 0.10

Tasks:   1 total,   0 running,   0 sleeping,   1 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 :  7990280 total,  6092100 free,   845696 used,  1052484 buff/cache

KiB Swap:  5242876 total,  5242876 free,        0 used.  6737552 avail Mem

 

   PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND   

 46776 root      25   5  149456   5428   2628 T   0.0  0.1   0:00.06 vim      

 

renice 数值 进程号

改变正在运行的进程的优先级

[root@localhost ~]# renice -10 46776

46776 (process ID) old priority 5, new priority -10

 

[root@localhost ~]# top -p 46776

top - 14:35:40 up 20:02,  4 users,  load average: 0.00, 0.07, 0.09

Tasks:   1 total,   0 running,   0 sleeping,   1 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 :  7990280 total,  6092304 free,   845452 used,  1052524 buff/cache

KiB Swap:  5242876 total,  5242876 free,        0 used.  6737748 avail Mem

 

   PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND   

 46776 root      10 -10  149456   5428   2628 T   0.0  0.1   0:00.06 vim       

 

posted @ 2020-12-31 13:11  AI非AI  阅读(197)  评论(0)    收藏  举报