Liunx进程管理(2)

2020-09-22   艺麟盛世

原标题:Liunx进程管理(2)

进程的查看与管理

在linux中,我们可以通过fg、bg、jobs、kill等来对工作进行管理和调度,这些工作都是我们手动执行的,而那些由系统开启的工作该如何管理呢?管理这些后台工作我们可以使用两种命令ps和top

[root@localhost ~]# ps 静态进程管理命令,可以帮助我们查看到ps命令在执行那一刻后台进程的状态

-A 所有进程,等同于-ax

-a 显示所有进程(与终端有关的除外)

-x 与参数a一起使用等同于-A

-u 显示指定用户的进程

-l 长格式

-f 完整输出

-t 从指定终端启动的进程

-C 执行指定命令的进程

[root@localhost ~]# ps aux 查看系统后台的所有进程

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

root 1 0.0 0.1 252828 11580 ? Ss 10月23 0:04 /us...

root 2 0.0 0.0 0 0 ? S 10月23 0:00 [kthreadd]

root 3 0.0 0.0 0 0 ? I< 10月23 0:00 [rcu_gp]

root 4 0.0 0.0 0 0 ? I< 10月23 0:00 [rcu_par_gp]

root 6 0.0 0.0 0 0 ? I< 10月23 0:00 [kworker/0:0H-kblockd]

root 8 0.0 0.0 0 0 ? I< 10月23 0:00 [mm_percpu_wq]

root 9 0.0 0.0 0 0 ? S 10月23 0:00 [ksoftirqd/0]

USER 开启进程的用户

PID 进程的识别号

%CPU 进程的cpu占用率

%MEM 进程的物理内存占用率

VSZ 虚拟内存用量,单位Kbytes

RSS 物理内存占用量 Kbytes

TTY 那个终端开启的

STAT 进程的状态

START 开启时间

TIME CPU占用时间

COMMAND 执行具体内容

[root@localhost ~]# ps -l 查看当前用户开启的进程

F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD

0 S 0 5191 5189 0 80 0 - 6994 - pts/1 00:00:02 bash

0 R 0 14972 5191 0 80 0 - 11240 - pts/1 00:00:00 ps

F 进程标识 4=权限为root 1=从父进程派生出来但是没有执行 5=1+4 0=没有被设置

S 进程状态 R=运行 S=睡眠,可被唤醒 D=睡眠,不可被唤醒(资源不足引起)T=停止

Z=僵尸进程

UID 用户识别号

PID 进程识别号

PPID 父进程号

C cpu使用率 %

PRI 内核调度优先级

NI 用户设置优先级

ADDR 加载到内存的位置,如果是运行的会用-表示

SZ 用掉的内存页的大小,1个内存页=4096Bytes 也就是6994x4=27976K内存

WCHAN 当前进程在哪个内核函数上睡眠,-表示正在运行,没有睡眠

TTY 由哪个终端开启的 pts/n=图形界面或远程 ttyn=字符界面 ?=系统进程

TIME 用掉的CPU时间

CMD 执行的命令

ps只能显示它运行的那一刻的进程的统计信息,如果你想动态的查看就需要使用top

top动态查看

[root@localhost ~]# top

-d 指定两次刷新的时间间隔,默认是3秒

-p 后面跟进程号,查看指定进程的状态,最多20个PID

-n 刷新指定次数后退出

-b 批量模式,可以让top将内容输出到指定的位置

top的按键

? 显示帮助

空格&enter 刷新

E 切换统计信息部分,内存显示的单位

e 切换任务列表的内存显示的单位

l 显示或隐藏摘要信息中的负载统计(第一行内容)

t 切换显示或隐藏摘要信息中任务和CPU统计信息(第2,3行内容)

m 切换显示或隐藏摘要信息中内存统计(第4,5行内容)

u 查看指定用户的进程

M 根据内存排序

P 根据cpu排序

N 根据PID排序

R 反向排序

F/f 调整任务列表显示的内容,默认只有PID,USER,PR,NI....COMMAND等这些,可 以自定义还需要显示哪些内容,如果显示的列比较多可以使用进行左右移动

shift+按照下一列的内容排序,比如说当前按照PID排序如果按下shift+>,则按照用户名 排序,再次按下就会按照PR排序,一次类推

T 根据cpu使用时间排序

k 杀死进程

r 修改进程的nice值(优先级)

z 将不同的位置标记颜色

x 高亮显示排序字段

y 高亮显示正在运行的任务

b 将高亮显示部分加上背景色

Z 自定义颜色

L 搜索指定字段,&下一个

H 在进程和线程间切换显示和统计方式,默认为进程

V 树形显示统计信息

J 显示内容左对齐或右对齐

c 切换COMMAND列的显示形式,程序名/命令格式

i 显示或隐藏空闲进程

u/U 查看指定用户的进程

d 设置刷新间隔,默认3秒刷新一次

W 将当前的设置写入到~/.config/procps/toprc中

q 退出top

[root@localhost ~]# top -d 1

1 top - 18:57:05 up 12:56, 3 users, load average: 0.00, 0.00, 0.00

2 Tasks: 280 total, 1 running, 279 sleeping, 0 stopped, 0 zombie

3 %Cpu(s): 1.5 us,1.5 sy,0.0 ni,97.0 id,0.0 wa,0.0 hi,0.0 si,0.0 st

4 MiB Mem : 3918.6 total, 160.1 free, 1264.5 used, 2494.0 buff/cache

5 MiB Swap: 2048.0 total, 2048.0 free, 0.0 used. 2356.6 avail Mem

6

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

1 root 20 0 244408 13740 9100 S 0.0 0.3 0:08.77 systemd

2 root 20 0 0 0 0 S 0.0 0.0 0:00.04 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 cu_par_gp

1-6行显示的内容为

1 当前时间为18:57:05;系统一共开机12小时56分;当前有3个用户登录;系统在1,5,15分钟的平均负载,越小表示系统越空闲

2 系统中进程的统计信息 总计280个,1个运行,279睡眠,0个停止,0个僵尸

3 cpu的负载 按键盘上的“1”可以按照CPU核心数显示

us: 用户空间进程占用CPU时间百分比

sy: 内核进程占用CPU时间百分比

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

id: 空闲CPU时间百分比(100%表示系统完全空闲)

wa: I/O等待占用的CPU时间百分比

hi: 硬件中断占用CPU时间百分比

si: 软件中断占用CPU时间百分比

st: 虚拟化hypervisor从当前虚拟机偷走的时间(如果这个值很高的话,说明你的提 供商的CPU资源有限,而你没能抢过别人,很有可能就是VPS提供商超售了.)

4&5 物理内存和虚拟内存相关的统计信息,尤其要注意swap,如果被大量占用,说明你物理内 存不足了

6 在top中输入命令时,会显示在这里

7 系统进程的信息

PID

USER

PR

NI

VIRT

RES

SHR

S

%CPU

%MEM

TIME+

COMMAND

top显示的内容有些看不到怎么办?

[root@localhost ~]# top -b -n1 > /tmp/top.txt

有些时候想查看的进程资源占用很低,在top中显示的比较靠后,怎么办?

[root@localhost ~]# top -d 2 -p 3562

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

%Cpu(s): 2.2 us, 3.9 sy, 0.0 ni, 93.3 id, 0.0 wa, 0.5 hi, 0.1 si, 0.0 st

MiB Mem : 3918.6 total, 1495.1 free, 1407.0 used, 1016.5 buff/cache

MiB Swap: 2048.0 total, 2048.0 free, 0.0 used. 2258.4 avail Mem

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

3562 root 20 0 49296 6380 4448 S 0.0 0.2 0:00.08 bash

上面所提到的两个查看系统进程的命令,静态的ps和动态的top,他们所显示的内容比较多,有的时候我只想查看一下进程之间的关系,这个时候我可以使用另外的一条命令

[root@localhost ~]# pstree

A 进程之间使用ASCII字符连接

U 进程之间使用UTF-8编码连接

p 显示进程号

u 显示用户

[root@localhost ~]# pstree -A | more

systemd-+-ModemManager---2*[{ModemManager}]

|-NetworkManager---2*[{NetworkManager}]

|-VGAuthService

|-accounts-daemon---2*[{accounts-daemon}]

|-alsactl

|-atd

|-auditd-+-sedispatch

| `-2*[{auditd}]

[root@localhost ~]# pstree -U | more

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

├─NetworkManager───2*[{NetworkManager}]

├─VGAuthService

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

├─alsactl

├─atd

├─auditd─┬─sedispatch

│ └─2*[{auditd}]

[root@localhost ~]# pstree -pu | more

systemd(1)-+-ModemManager(916)-+-{ModemManager}(943)

| `-{ModemManager}(949)

|-NetworkManager(1040)-+-{NetworkManager}(1050)

| `-{NetworkManager}(1053)

|-VGAuthService(902)

|-accounts-daemon(1010)-+-{accounts-daemon}(1013)

| `-{accounts-daemon}(1015)

|-alsactl(909)

|-atd(1076)

|-auditd(862)-+-sedispatch(864)

| |-{auditd}(863)

| `-{auditd}(865)

|-avahi-daemon(910,avahi)---avahi-daemon(953)

我们现在可以通过三种方法来查看后台的进程,那么后台的进程该如何管理呢?管理后台的进程,除了我们前面提到的kill命令之外还可以使用killall

[root@localhost ~]# kill PID

需要注意的是,kill后面如果加的是%num代表杀死后台指定序号的工作,如果不加%代表的是杀死指定进程号的进程,这两个是有区别的

[root@localhost ~]# killall

e 精确匹配,最多不能超过15个字符

i 询问用户是否杀死指定名称的进程

I 进程的名称忽略大小写

[root@localhost ~]# cat /dev/zero > /dev/null &

[1] 102245

[root@localhost ~]# ps -l

F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD

0 S 0 3562 3559 0 80 0 - 12324 - pts/1 00:00:00 bash

0 R 0 102245 3562 97 80 0 - 1908 - pts/1 00:00:01 cat

0 R 0 102246 3562 0 80 0 - 11240 - pts/1 00:00:00 ps

[root@localhost ~]# killall -ei cat

杀死 cat(102870) ? (y/N) y

[1]+ 已终止 cat /dev/zero > /dev/null