Centos8-系统进程管理
十、Centos8-系统进程管理
10.1、进程概述和 ps 管理进程
10.1.1 什么是进程?
进程: 是程序运行的过程, 动态,有生命周期及运行状态,是已启动的可执行程序的运行实例。
进程有以下组成部分:
• 已分配内存的地址空间;
• 安全属性,包括所有权凭据和特权;
• 程序代码的一个或多个执行线程;
• 进程状态
线程:进程和线程都是由操作系统所体会的程序运行的基本单元,系统利用该基本单元实现系统对应用的并发性。进程和线程的区别在于:简而言之,一个程序至少有一个进程,一个进程至少有一个线程。
程序: 二进制文件(程序即二进制文件),静态实体 /bin/date,/usr/sbin/sshd
下图所示的是进程的生命周期:
父进程复制自己的地址空间(fork [fɔ:k] 分叉)创建一个新的(子)进程结构。每个新进程分配一个唯一的进程 ID (PID),满足跟踪安全性之需。PID 和 父进程 ID (PPID)是子进程环境的元素,任何进程都可以创建子进程,所有进程都是第一个系统进程的后代。
centos5 或 6PID 为 1 的进程是: init
centos7 PID 为 1 的进程是: systemd
centso8 PID 为 1 的进程是: systemd
僵尸进程:一个进程使用 fork 创建子进程,如果子进程退出,而父进程并没有调用 wait 或 waitpid 获取子进程的状态信息,那么子进程的进程描述符仍然保存在系统中。这种进程称之为僵尸进程。
人话:父进程退出了, 子进程没有退出, 那么这些子进程就没有父进程来管理,就变成僵尸进程。
10.1. 2 进程的属性
进程 ID(PID):是唯一的数值,用来区分进程
父进程的 ID(PPID)
启动进程的用户 ID(UID)和所归属的组(GID)
进程状态:状态分为运行 R(running)、休眠 S(sleep)、僵尸 Z(zombie)
进程执行的优先级
进程所连接的终端名
进程资源占用:比如占用资源大小(内存、CPU 占用量)
10.1.3 使用 ps 查看进程工具
1、ps 查看进程工具
例 1:常用的参数:
a: 显示跟当前终端关联的所有进程
u: 基于用户的格式显示(U: 显示某用户 ID 所有的进程)
x: 显示所有进程,不以终端机来区分
#####常用的选项组合是:ps -aux
[root@Hengji ~]# ps aux | more
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.6 0.1 245368 14104 ? Ss 14:45 0:02 /usr/lib/systemd/sys
temd --switched-root --system --deserialize 18
root 2 0.0 0.0 0 0 ? S 14:45 0:00 [kthreadd]
root 3 0.0 0.0 0 0 ? I< 14:45 0:00 [rcu_gp]
root 4 0.0 0.0 0 0 ? I< 14:45 0:00 [rcu_par_gp]
root 5 0.0 0.0 0 0 ? I 14:45 0:00 [kworker/0:0-events]
root 6 0.0 0.0 0 0 ? I< 14:45 0:00 [kworker/0:0H-kblock
d]
root 7 0.0 0.0 0 0 ? I 14:45 0:00 [kworker/u256:0-even
ts_unbound]
root 8 0.0 0.0 0 0 ? I< 14:45 0:00 [mm_percpu_wq]
root 9 0.0 0.0 0 0 ? S 14:45 0:00 [ksoftirqd/0]
root 10 0.0 0.0 0 0 ? I 14:45 0:00 [rcu_sched]
root 11 0.0 0.0 0 0 ? S 14:45 0:00 [migration/0]
root 12 0.0 0.0 0 0 ? S 14:45 0:00 [watchdog/0]
root 13 0.0 0.0 0 0 ? S 14:45 0:00 [cpuhp/0]
root 14 0.0 0.0 0 0 ? S 14:45 0:00 [cpuhp/1]
root 15 0.0 0.0 0 0 ? S 14:45 0:00 [watchdog/1]
root 16 0.0 0.0 0 0 ? S 14:45 0:00 [migration/1]
root 17 0.0 0.0 0 0 ? S 14:45 0:00 [ksoftirqd/1]
root 19 0.0 0.0 0 0 ? I< 14:45 0:00 [kworker/1:0H-kblock
d]
root 20 0.0 0.0 0 0 ? S 14:45 0:00 [cpuhp/2]
root 21 0.0 0.0 0 0 ? S 14:45 0:00 [watchdog/2]
root 22 0.0 0.0 0 0 ? S 14:45 0:00 [migration/2]
上面的参数输出每列含意:
USER:启动这些进程的用户
PID:进程的 ID
%CPU:进程占用的 CPU 百分比;
%MEM:占用内存的百分比;
VSZ:进程占用的虚拟内存大小(单位:KB)
RSS:进程占用的物理内存大小(单位:KB)
STAT:该程序目前的状态,Linux 进程有 5 种基本状态:
R:该程序目前正在运行,或者是可被运行;
S:该程序目前正在睡眠当中,但可被某些讯号(signal) 唤醒。
T:该程序目前正在侦测或者是停止了;
Z:该程序应该已经终止,但是其父程序却无法正常的终止他,造成 zombie (僵尸) 程序的状态
D:不可中断状态。
5 个基本状态后,还可以加一些字母,比如:Ss、R+,如下图:
它们含意如下:
<:表示进程运行在高优先级上
N:表示进程运行在低优先级上
L:表示进程有页面锁定在内存中
s:表示进程是控制进程
l:表示进程是多线程的
+:表示当前进程运行在前台
START:该 process 被触发启动的时间;
TIME:该 process 实际使用 CPU 运作的时间。
COMMAND:该程序的实际指令
查看进程状态
[root@Hengji ~]# vim a.txt
在另一个终端执行:
[root@Hengji ~]# ps -aux | grep a.txt #查看状态 S 表示睡眠状态, + 表示前台
root 2676 0.0 0.1 48872 8492 pts/0 S+ 15:01 0:00 vim a.txt
root 2686 0.0 0.0 12320 1056 pts/1 S+ 15:01 0:00 grep --color=auto a.txt
在 vim a.txt 这个终端上 按下: ctrl+z
[1]+ 已停止 vim a.txt
在另一个终端执行:
[root@Hengji ~]# ps -aux | grep a.txt #查看状态 S 表示停止状态
root 2676 0.0 0.1 48872 8492 pts/0 T 15:01 0:00 vim a.txt
root 2700 0.0 0.0 12320 988 pts/1 S+ 15:02 0:00 grep --color=auto a.txt
ctrl-c 是发送 SIGINT 信号,终止一个进程
ctrl-z 是发送 SIGSTOP 信号,挂起一个进程。将作业放置到后台(暂停)
ctrl-d 不是发送信号,而是表示一个特殊的二进制值,表示 EOF。代表输入完成或者注销
D 不可中断状态
[root@Hengji ~]# tar -zcvf usr-tar.gz /usr/
然后在另一个终端不断查看状态,由 S+或R+变为 D+
2、ps 常用的参数: ps -ef
-e:显示所有进程
-f:显示完整格式输出
我们常用的组合:ps -ef
[root@Hengji ~]# ps -ef | head
UID PID PPID C STIME TTY TIME CMD
root 1 0 0 14:45 ? 00:00:02 /usr/lib/systemd/systemd --switched-root --system --deserialize 18
root 2 0 0 14:45 ? 00:00:00 [kthreadd]
root 3 2 0 14:45 ? 00:00:00 [rcu_gp]
root 4 2 0 14:45 ? 00:00:00 [rcu_par_gp]
root 5 2 0 14:45 ? 00:00:00 [kworker/0:0-events_freezable_power_]
root 6 2 0 14:45 ? 00:00:00 [kworker/0:0H-kblockd]
root 7 2 0 14:45 ? 00:00:00 [kworker/u256:0-events_unbound]
root 8 2 0 14:45 ? 00:00:00 [mm_percpu_wq]
root 9 2 0 14:45 ? 00:00:00 [ksoftirqd/0]
包含的信息如下:
UID:启动这些进程的用户
PID:进程的 ID
PPID:父进程的进程号
C:进程生命周期中的 CPU 利用率
STIME:进程启动时的系统时间
TTY:表明进程在哪个终端设备上运行。如果显示 ?表示与终端无关,这种进程一般是内核态进程。另外,tty1-tty6是本机上面的登入者程序,若为 pts/0 等,则表示运行在虚拟终端上的进程。
TIME:运行进程一共累计占用的 CPU 时间
CMD:启动的程序名称
测试 CPU 使用时间
[root@Hengji ~]# dd if=/dev/zero of=/a.txt count=10 bs=100M
记录了10+0 的读入
记录了10+0 的写出
1048576000 bytes (1.0 GB, 1000 MiB) copied, 5.23885 s, 200 MB/s
[root@Hengji ~]# ps -axu | grep dd
root 2 0.0 0.0 0 0 ? S 17:35 0:00 [kthreadd]
root 55 0.0 0.0 0 0 ? I 17:35 0:00 [kworker/3:1-ipv6_addrconf]
root 207 0.0 0.0 0 0 ? I< 17:35 0:00 [ipv6_addrconf]
dbus 861 0.8 0.1 91872 8744 ? Ssl 17:36 0:00 /usr/bin/dbus-daemon --system --address=systemd: --nofork --nopidfile --systemd-activation --syslog-only
gdm 1460 0.1 0.0 83064 6112 ? Ssl 17:36 0:00 /usr/bin/dbus-daemon --session --address=systemd: --nofork --nopidfile --systemd-activation --syslog-only
gdm 1526 0.0 0.0 82616 5784 ? Sl 17:36 0:00 /usr/bin/dbus-daemon --config-file=/usr/share/defaults/at-spi2/accessibility.conf --nofork --print-address 3
root 1796 0.6 0.0 83532 6720 ? Ssl 17:37 0:00 /usr/bin/dbus-daemon --session --address=systemd: --nofork --nopidfile --systemd-activation --syslog-only
root 1930 0.0 0.0 82620 5560 ? Sl 17:37 0:00 /usr/bin/dbus-daemon --config-file=/usr/share/defaults/at-spi2/accessibility.conf --nofork --print-address 3
root 2160 0.2 0.3 837576 29716 ? Ssl 17:37 0:00 /usr/libexec/evolution-addressbook-factory
root 2192 0.6 0.4 1122228 36268 ? Sl 17:37 0:00 /usr/libexec/evolution-addressbook-factory-subprocess --factory all --bus-name org.gnome.evolution.dataserver.Subprocess.Backend.AddressBookx2160x2 --own-path /org/gnome/evolution/dataserver/Subprocess/Backend/AddressBook/2160/2
root 2405 0.0 0.0 12320 1032 pts/0 S+ 17:37 0:00 grep --color=auto dd
注:
ps aux 是用 BSD 的格式来显示进程。
ps -ef 是用标准的格式显示进程。
10.2、uptime 查看系统负载-top 动态管理进程
10.2.1 uptime 查看 CPU 负载工具
[root@Hengji ~]# uptime
13:22:30 up 20days, 2 users, load average: 0.06, 0.60, 0.48
弹出消息含意如下:
实例 | 含义 |
---|---|
13:22:30 | 当前时间 |
up 20days | 系统运行时间 ,说明此服务器连续运行 20 天了 |
2 user | 当前登录用户数 |
load average: 0.06, 0.60,0.48 | 系统负载,即任务队列的平均长度。 三个数值分别为 1分钟、5 分钟、15 分钟前到现在的平均值。 |
10.2.2 top 命令
[root@Hengji ~]# top 弹出的每行信息含意如下:
第一行内容和 uptime 弹出的信息一样
进程和 CPU 的信息( 第二、三行)
实例 | 含义 |
---|---|
Tasks: 279 total | 进程总数 |
1 running | 正在运行的进程数 |
278 sleeping | 睡眠的进程数 |
0 stopped | 停止的进程数 |
0 zombie | 僵尸进程数 |
Cpu(s): 0.8% us | 系统用户进程使用 CPU 百分比。 |
0.7% sy | 内核中的进程占用 CPU 百分比 |
0.0% ni | 用户进程空间内改变过优先级的进程占用 CPU 百分比 |
98.4% id | 空闲 CPU 百分比 |
0.0% wa | cpu 等待 I/0 完成的时间总量 |
0.1% hi 硬中断消耗时间 | 硬中断,占的 CPU 百分比。 |
0.0% si 软中断消耗时间 | 软中断,占的 CPU 百分比。 |
0.0 st (steal 偷) | st:虚拟机偷取物理的时间。比如:物理机已经运行了 KVM,XEN 虚拟机。KVM 虚拟机占用物理机的 cpu 时间 |
内存信息(第四五行)
实例 | 含义 |
---|---|
Mem: 7944.5 total | 物理内存总量 |
4954.8 free | 空闲内存总量 |
1416.5 used | 使用的物理内存总量 |
1573.3 buff/cache | 用作内核缓存的内存量。 |
Swap: 2048.0 total | 交换区总量 |
2048.0 free | 空闲交换区总量 |
0.0 used | 使用的交换区总量 |
6241.9 avail Mem | 总的可利用内存是多少 |
注:如果 swap 分区,被使用,那么你的内存不够用了。
第 7 行进程信息
列名 | 含义 |
---|---|
PID | 进程 id |
USER | 进程所有者的用户名 |
PR | 优先级(由内核动态调整),用户不能 |
NI | 进程优先级。 nice 值。负值表示高优先级,正值表示低优先级,用户可以自己调整 |
VIRT(virtual memory usage) | 虚拟内存,是进程正在使用的所有内存(ps 中标为 VSZ) |
RES(resident memory usage) | 是进程所使用的物理内存。实际实用内存(ps 中标为 RSS) |
SHR | 共享内存大小,单位 kb |
S | 进程状态。D=不可中断的睡眠状态 R=运行中或可运行 S=睡眠中 T=已跟踪/已停止 Z=僵停 |
%CPU | 上次更新到现在的 CPU 时间占用百分比 |
%MEM | 进程使用的物理内存百分比 |
TIME+ | 进程使用的 CPU 时间总计,单位 1/100 秒 |
COMMAND | 命令名/命令行 |
top 快捷键:
默认 3s 刷新一次,按 s 修改刷新时间
按空格:立即刷新。
q:退出
P:按 CPU 排序
M:按内存排序
T:按时间排序
p:进程 IP,查看某个进程状态
数字键 1:显示每个内核的 CPU 使用率
u/U:指定显示的用户
h:帮助
使用 TOP 动态只查看某个或某些进程的信息找到进程 ID
[root@Hengji ~]# ps -axu | grep vim
root 3097 0.0 0.0 12320 1100 pts/1 S+ 15:15 0:00 grep --color=auto vim
[root@Hengji ~]# top -p 3097
找出系统中使用 CPU 最多的进程
运行 top , 找出使用 CPU 最多的进程 ,按大写的 P,可以按 CPU 使用率来排序显示
在 linux 系统中一个进程,最多可以使用 100%cpu 对吗?
如下图,可以看到 dirtycow(脏牛漏洞,用于提权) 进程使用 196.8%
这是你第一次看见: 1
如果你的 4 核心的 cpu,你可以运行 400%
10.2.4 lsof 命令
lsof 命令用于查看你进程开打的文件,打开文件的进程,进程打开的端口(TCP、UDP)
-i<条件>:列出符合条件的进程。(4、6、协议、:端口、 @ip )
-p<进程号>:列出指定进程号所打开的文件。
[root@Hengji ~]# vim a.txt
[root@Hengji ~]# ps -axu | grep a.txt
root 3358 0.0 0.1 48804 8552 pts/0 S+ 15:23 0:00 vim a.txt
root 3360 0.0 0.0 12320 1072 pts/1 S+ 15:23 0:00 grep --color=auto a.txt
[root@Hengji ~]# lsof -p 3358 #一般用于查看木马进程,在读哪些文件
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
vim 3358 root cwd DIR 8,2 4096 67160193 /root
vim 3358 root rtd DIR 8,2 224 128 /
...
[root@Hengji ~]# lsof -i :22 #用于查看端口,或查看黑客开启的后门端口是哪个进程在使用
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
sshd 1027 root 5u IPv4 31451 0t0 TCP *:ssh (LISTEN)
sshd 1027 root 7u IPv6 31453 0t0 TCP *:ssh (LISTEN)
10.2.5 free 显示系统中可用内存和已用内存的数量
free 命令查看内存使用状态
子选项:
-b:以字节为单位表示。
-k:以 KB 为单位显示,默认是以 KB 为单位显示。
-m:以 MB 为单位显示。
-g:以 GB 为单位显示。
[root@Hengji ~]# free -m
total used free shared buff/cache available
Mem: 7944 1397 4833 18 1712 6259
Swap: 2047 0 2047
其中:
第一行:total 是总内存量,used 是已经使用的内存量,free 是空闲的内存,shared 是多个进程共享的内存总数,buffers 是缓冲内存数,cache 是缓存内存数。默认单位是 KB。available 实际可用(case 加速读,buffers 加速写。)
第二行:total 系统中有 972MB 的物理内存,used 是已经使用的内存数量。free 是空闲的内存数量。shared 是多个进程共享的内存数量。buff/cache 用来作为缓冲和缓存的空间,内核会在内存将要耗尽时释放这部分内存给其他进程使用。availble:可使用空间,评估有多少内存可用于启动新应用程序,不包括swap,不同于 free 和 cache 字段。available 字段考虑了页缓存,而不是所有可回收的内存。正因为这个原因所以通常 free+buff/cache 的数值要比 available 的数值大。
第三行: swap 虚拟内存。
如果我们发现 swap 区域一直被大量使用,这就说明物理内存不足。可能需要考虑系统上 swap 使用比例或者添加物理内存。
10.3、前后台进程切换- nice 进程优先级-实战 screen 后台执行命令
10.3.1 Linux 后台进程与前台进程的区别
前台进程:是在终端中运行的命令,那么该终端就为进程的控制终端,一旦这个终端关闭,这个进程也随着消失。
后台进程:也叫守护进程(Daemon),是运行在后台的一种特殊进程,不受终端控制,它不需要终端的交互。
Linux 的大多数服务器就是用守护进程实现的。比如,Web 服务器 httpd 等。
###10.3.2 进程的前台与后台运行
跟系统任务相关的几个命令:
实例 | 含义 |
---|---|
& | 用在一个命令的最后,可以把这个命令放到后台执行. |
ctrl + z | 将一个正在前台执行的命令放到后台,并且暂停. |
jobs | 查看当前有多少在后台运行的进程.它是一个作业控制命令 |
fg(foreground process) | 将后台中的命令调至前台继续运行, 如果后台中有多个命令,可以用 fg %jobnumber 将选中的命令调出,%jobnumber 是通过 jobs 命令查到的后台正在执行的命令的序号(不是 pid) |
bg(background process) | 将一个在后台暂停的命令,变成继续执行; 如果后台中有多个命令,可以用bg %jobnumber 将选中的命令调出,%jobnumber 是通过 jobs 命令查到的后台正在执行的命令的序号(不是 pid) |
####恢复被挂起的进程
[root@Hengji ~]# ps -axu | grep vim
root 3639 0.0 0.0 12320 976 pts/1 S+ 15:39 0:00 grep --color=auto vim
[root@Hengji ~]# vim a.txt #打开后,然后执行 ctrl+z
[1]+ 已停止 vim a.txt
[root@Hengji ~]# vim a.txt
[2]+ 已停止 vim a.txt
[root@Hengji ~]# ps -axu | grep vim
root 3654 0.0 0.1 48844 8584 pts/1 T 15:40 0:00 vim a.txt
root 3661 0.1 0.1 48848 8620 pts/1 T 15:40 0:00 vim a.txt
root 3669 0.0 0.0 12320 1036 pts/1 S+ 15:40 0:00 grep --color=auto vim
[root@Hengji ~]# jobs #查看当前有多少在后台运行的进程
[1]- 已停止 vim a.txt
[2]+ 已停止 vim a.txt
[root@Hengji ~]# fg 1 #将后台挂起的进程恢复到前台运行
vim a.txt
10.3.3 kill 关闭进程
关闭进程 3 个命令:kill killall pkill
kill 关闭进程:kill 进程号 关闭单个进程
killall 和 pkill 命令:用于杀死指定名字的进程
[root@Hengji ~]# 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 和 killall 终止进程
[root@Hengji ~]# kill -9 2342
[root@Hengji ~]# killall sshd
[root@Hengji ~]# pkill sshd
10.3.4 进程的优先级管理
优先级取值范围为(-20,19),越小优先级越高, 默认优先级是 0
优先级越高占用的 CPU 值就越高
命令 1:nice 指定程序的运行优先级
格式:nice n command
命令 2:renice 改变程序的运行优先级
格式:renice -n pid
指定运行 vim 的优先级为 5
[root@Hengji ~]# nice -n 5 vim a.txt #输入内容,然后 ctrl+z 挂起
[1]+ 已停止 nice -n 5 vim a.txt
[root@Hengji ~]# ps -aux|grep vim #通过 ps 查看这个文件的 PID 号
root 3876 0.0 0.1 48812 8512 pts/0 TN 15:46 0:00 vim a.txt
root 3888 0.0 0.0 12320 1104 pts/0 S+ 15:46 0:00 grep --color=auto vim
[root@Hengji ~]# top -p 3876 #通过 top 命令查看优先级
top - 15:47:22 up 1:02, 1 user, load average: 0.03, 0.04, 0.00
Tasks: 1 total, 0 running, 0 sleeping, 1 stopped, 0 zombie
%Cpu(s): 0.4 us, 0.6 sy, 0.0 ni, 98.8 id, 0.0 wa, 0.2 hi, 0.0 si, 0.0 st
MiB Mem : 7944.5 total, 4835.5 free, 1393.9 used, 1715.1 buff/cache
MiB Swap: 2048.0 total, 2048.0 free, 0.0 used. 6263.8 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
3876 root 25 5 48812 8512 5712 T 0.0 0.1 0:00.00 vim
改变正在运行的进程的优先级
[root@Hengji ~]# renice -10 3876
3876 (process ID) 旧优先级为 5,新优先级为 -10
[root@Hengji ~]# top -p 3876