一、进程概述
1、程序和进程
(1)程序:保存在硬盘等介质中的可执行的二进制文件,静态的/usr/bin/passwd ,/usr/sbin/useradd,本质就是不运行的文件。
(2)进程:是程序运行的过程中产生,动态的,有生命周期的运行状态,是一个运行着的、要占用系统运行资源的程序。在CPU及内存中运行的程序代码,动态执行的代码。一个程序可以由多个进程共用
进程是已启动的可执行程序的运行实例,进程有以下组成部分:
• 已分配内存的地址空间;
• 安全属性,包括所有权凭据和特权;
• 程序代码的一个或多个执行线程;
• 进程状态。
系统给每一个进程都分配了一个唯一的进程标识符(称PID)
2、进程的生命周期
父进程复制自己的地址空间(fork)创建一个新的(子)进程结构。
每个新进程分配一个,唯一的进程 ID (PID),满足跟踪安全性之需。
任何进程都可以创建子进程。
PID 和 PPID(父进程 ID) 是子进程环境的元素,任何进程都可以创建子进程,所有进程都是第一个系统进程的后代。
所有进程都是第一个系统进程的后代:
Centos5/6系统进程(PID 1): init
Centos7系统进程(PID 1): systemd
父进程与子进程:
(1)子进程是由一个进程所产生的进程,产生这个子进程的进程叫做父进程。
(2)使用系统调用fork创建进程。fork复制的内容包括父进程的数据和堆栈段以及父进程的进程环境。
(3)父进程终止,那么子进程也随之自然终止。
(4)呈树状结构,初始化进程是根节点,其他的进程均有父进程。
3、进程分类
(1)前台进程:
在shell提示处输入命令后,创建一个子进程,运行命令,shell等待命令退出,然后返回到对用户提示符。即在前台运行,用户在它完成之前不能执行另一个命令。
(2)后台进程:
在shell提示处输入命令,如果后面跟着一个“&”
符号,shell创建的子进程运行此命令,但不等待命令退出,而直接返回到对用户给出提示符。并且这条命令与shell同步运行,即在后台运行,后台进程必然是非交互式的。
(3)批处理进程:一个进程序列
(4)守护进程:又称为监控进程,是指那些在后台运行,并且没有控制终端的进程。
4、进程状态
在多任务处理操作系统中,每个CPU在一个时间点上只能处理一个进程。
在进程运行时,它对CPU 时间和资源分配的要求会不断变化,
从而为进程分配一个状态,它随着环境要求而改变。
运行R
(Running):正在运行或在运行队列中等待。
睡眠S
(Sleeping):休眠中, idle 状态, 在等待某个条件的形成或接受到信号。
僵死Z
(Zommbie):进程已终止, 但父进程无法正常终止它。
停止T
(Stopped):停止状态,不会在被调用到cpu上运行。
二、静态查看进程 ps
ps
直译为Process Status
,用来显示系统中当前运行的进程的快照,故 ps 只提供了进程的一次性查看。
常用格式:ps aux
; ps -elf
选项说明:
命令参数 | 含义 |
---|---|
a | 显示跟当前终端关联的所有进程 |
u | 基于用户的格式显示,用户名和启动时间,不以终端来区分 |
x | 显示所有进程 |
c | 显示每个程序真正的指令名称,而不包含路径,参数或常驻服务 |
e | 显示每个程序所使用的环境变量 |
-l | 详细显示进程信息,长格式显示 |
案例一:显示所有进程 ps aux | more
[root@centos7 ~]#ps aux | more
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.1 194196 7368 ? Ss 09:23 0:09 /usr/lib/systemd/systemd --switched
-root --system --deserialize 22
root 2 0.0 0.0 0 0 ? S 09:23 0:00 [kthreadd]
root 4 0.0 0.0 0 0 ? S< 09:23 0:00 [kworker/0:0H]
root 6 0.0 0.0 0 0 ? S 09:23 0:00 [ksoftirqd/0]
root 7 0.0 0.0 0 0 ? S 09:23 0:00 [migration/0]
root 8 0.0 0.0 0 0 ? S 09:23 0:00 [rcu_bh]
root 9 0.0 0.0 0 0 ? S 09:23 0:08 [rcu_sched]
root 10 0.0 0.0 0 0 ? S< 09:23 0:00 [lru-add-drain]
root 11 0.0 0.0 0 0 ? S 09:23 0:00 [watchdog/0]
root 12 0.0 0.0 0 0 ? S 09:23 0:00 [watchdog/1]
列注释:
1、USER:运行进程的用户
2、PID:该进程的ID
3、%CPU:进程的CPU占用率
4、%MEM:进程的内存占用率
5、VSZ:该进程使用掉的虚拟内存大小KB
6、RSS:该进程占用的实际的内存大小KB
7、TTY:该进程在哪个终端上运行,若与终端己无关,则显示“?”。
8、STAT:该程序的状态,主要状态有
R(正在运行):进程正在运行,或者被运行
S(睡眠):该进程目前正在睡眠中,可被某些信息唤醒。
T(停止):该进程目前正在侦测或者停止了
Z(僵死):该进程应该已终止,但父进程却无法正常的终止他,造成僵尸进程的状态。
D:不可中断
9、START:该进程被触发启动的时间
10、TIME:该进程实际使用CPU运作的时间
11、COMMAND:该进程的实际指令
最后一列,使用括
[ ]
起来的进程是内核态进程,没有括起来的是用户态进程
案例二:对进程的指定列排序 ps aux --sort
1)对CPU进行降序排列: –sort -%cpu 从高到低
减号是降序
[root@centos7 ~]#ps -aux --sort -%cpu | more
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 18343 0.9 0.7 735896 27116 ? Sl 16:58 0:00 /usr/libexec/gnome-terminal-server
root 745 0.2 0.1 295376 5192 ? Ssl 09:24 1:09 /usr/bin/vmtoolsd
root 2420 0.2 0.6 608716 25696 ? Sl 09:25 1:02 /usr/bin/vmtoolsd -n vmusr
root 350 0.1 0.0 0 0 ? S 09:24 0:29 [xfsaild/sda2]
root 2118 0.1 4.8 3604380 186244 ? Sl 09:24 0:51 /usr/bin/gnome-shell
root 10186 0.1 5.9 2989664 231500 ? Sl 09:56 0:43 /usr/lib64/firefox/firefox
root 16130 0.1 0.0 0 0 ? S 13:22 0:18 [kworker/2:2]
root 18316 0.1 0.0 0 0 ? S 16:55 0:00 [kworker/3:1]
root 18350 0.1 0.0 116960 3508 pts/0 Ss 16:58 0:00 bash
root 18365 0.1 0.1 350492 6764 ? Sl 16:58 0:00 /usr/sbin/abrt-dbus -t133
root 18403 0.1 0.1 149264 5004 pts/0 S+ 16:58 0:00 vim 1.text
2)对CPU进行升序排列: –sort %cpu 从低到高
[root@centos7 ~]#ps -aux --sort %cpu | more
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.1 194196 7368 ? Ss 09:23 0:09 /usr/lib/systemd/systemd --switched
-root --system --deserialize 22
root 2 0.0 0.0 0 0 ? S 09:23 0:00 [kthreadd]
root 4 0.0 0.0 0 0 ? S< 09:23 0:00 [kworker/0:0H]
案例三:进程的父子关系 ps -elf
[root@centos7 ~]#ps -elf | head -10
F S UID PID PPID C PRI NI ADDR SZ WCHAN STIME TTY TIME CMD
4 S root 1 0 0 80 0 - 48549 ep_pol 09:23 ? 00:00:09 /usr/lib/systemd/systemd --switched-root --system --deserialize 22
1 S root 2 0 0 80 0 - 0 kthrea 09:23 ? 00:00:00 [kthreadd]
1 S root 4 2 0 60 -20 - 0 worker 09:23 ? 00:00:00 [kworker/0:0H]
1 S root 6 2 0 80 0 - 0 smpboo 09:23 ? 00:00:00 [ksoftirqd/0]
1 S root 7 2 0 -40 - - 0 smpboo 09:23 ? 00:00:00 [migration/0]
1 S root 8 2 0 80 0 - 0 rcu_gp 09:23 ? 00:00:00 [rcu_bh]
1 S root 9 2 0 80 0 - 0 rcu_gp 09:23 ? 00:00:08 [rcu_sched]
1 S root 10 2 0 60 -20 - 0 rescue 09:23 ? 00:00:00 [lru-add-drain]
5 S root 11 2 0 -40 - - 0 smpboo 09:23 ? 00:00:00 [watchdog/0]
列注释:
1、F:代表这个程序的旗标(flag),其中“4”代表使用者为super user。
2、S:代表这个程序的状态(STAT),与ps aux的STAT状态一致
3、UID:该进程的程序用户。
4、PID:该进程的进程号。
5、PPID:父进程的进程号。
6、C:CPU使用的资源百分比
7、PRI:priority的缩写,优先执行权,值越小越早被执行。
8、NI:Nice值,表示进程可被执行的优先级的修正数值。
9、ADDR:内核函数,指出该进程在内存的那个部分,如果是running的进程,一般显示“-”
10、SZ:该进程使用掉的内存大小。
11、WCHAN:该进程是否正在运行状态。
12、TTY:该进程的终端机位置。
13、TIME:使用掉的CPU时间。
14、CMD:该进程的指令。
注意:ps是显示瞬间进程的状态,并不动态连续;如果想对进程进行实时监控应该用top命令。
案例四:自定义显示字段
[root@centos7 ~]#ps axo user,pid,ppid,%mem,command |head -5
USER PID PPID %MEM COMMAND
root 1 0 0.1 /usr/lib/systemd/systemd --switched-root --system --deserialize 22
root 2 0 0.0 [kthreadd]
root 4 2 0.0 [kworker/0:0H]
root 6 2 0.0 [ksoftirqd/0]
三、动态查看进程 top
top
用于动态监测进程和系统相关属性信息,查看系统资源使用情况以及进程排名信息,默认3秒刷新一次。
[root@centos7 ~]#top
top - 17:43:30 up 8:19, 3 users, load average: 0.00, 0.01, 0.05
Tasks: 245 total, 1 running, 244 sleeping, 0 stopped, 0 zombie
%Cpu(s): 0.0 us, 0.1 sy, 0.0 ni, 99.8 id, 0.1 wa, 0.0 hi, 0.0 si, 0.0 st
KiB Mem : 3861292 total, 1534436 free, 1135568 used, 1191288 buff/cache
KiB Swap: 4092 total, 4092 free, 0 used. 2442492 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
350 root 20 0 0 0 0 S 0.3 0.0 0:31.64 xfsaild/sda2
745 root 20 0 295376 5192 3952 S 0.3 0.1 1:15.23 vmtoolsd
18857 root 20 0 162220 2380 1572 R 0.3 0.1 0:00.41 top
1 root 20 0 194196 7368 4260 S 0.0 0.2 0:09.53 systemd
2 root 20 0 0 0 0 S 0.0 0.0 0:00.07 kthreadd
4 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 kworker/0:0H
6 root 20 0 0 0 0 S 0.0 0.0 0:00.86 ksoftirqd/0
上半部分:
下半部分:列说明
PID:进程id
USER:进程所有者的用户名。
PR:优先级(由内核动态调整),用户不能修改。
NI进程优先级。 nice值。负值表示高优先级,正值表示低优先级
,用户可以自己调整。
VIRT(virtual memory usage):虚拟内存,是进程正在使用的所有内存(ps 中标为 VSZ)
RES(resident memory usage):是进程所使用的物理内存。实际使用内存(ps 中标为 RSS)
SHR(shared memory):共享内存大小,单位kb。除 M自身进程的共享内存,也包括其他进程的共享内存
S:进程状态。D=不可中断的睡眠状态
R=运行中或可运行
S=睡眠中
T=已停止
Z=僵死%CPU: CPU 时间占用百分比
%MEM:进程使用的物理内存百分比
TIME+:进程使用的 CPU 时间总计,单位 1/100 秒
COMMAND:命令名/命令行
Idle 是空闲的,意思还有多少可以用。
1、命令参数、快捷键
命令参数
命令参数 | 含义 |
---|---|
-d | 秒数 指定每隔几秒更新 |
-i | 不显示任何闲置或僵死进程 |
-p | 通过指定监控进程ID来监控某个进程的状态 |
快捷键
快捷键 | 含义 |
---|---|
P | 以CPU使用率排序(默认) |
M | 以内存使用率排序 |
N | 以PID排序 |
z | 彩色 |
Z | 彩色,使用数字调整,0黑,1红,2绿,3黄,4蓝 |
u | 查看某个用户进程,进而结束进程 |
还有很多,可以在帮助(man)中查找。
案例一:指定PID,指定时间间隔
[root@centos7 ~]#top #回车,立刻刷新
[root@centos7 ~]#top -d 1 #每秒刷新
[root@centos7 ~]#top -d 1 -p 20817 #每秒刷新,指定进程动态
[root@centos7 ~]#top -d 1 -p 2118,1 #每秒刷新,指定进程动态
[root@centos7 ~]#top -d 1 -p 2118,1
top - 22:47:32 up 10:56, 4 users, load average: 0.00, 0.01, 0.05
Tasks: 2 total, 0 running, 2 sleeping, 0 stopped, 0 zombie
%Cpu(s): 0.2 us, 0.0 sy, 0.0 ni, 99.8 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
KiB Mem : 3861292 total, 1475660 free, 1190340 used, 1195292 buff/cache
KiB Swap: 4092 total, 4092 free, 0 used. 2385604 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
2118 root 20 0 3873888 191524 68412 S 0.0 5.0 1:03.28 gnome-shell
1 root 20 0 194196 7368 4260 S 0.0 0.2 0:10.02 systemd
案例二:指定用户
[root@centos7 ~]#top -d 1 -u cyan
top - 22:51:52 up 11:00, 4 users, load average: 0.04, 0.04, 0.05
Tasks: 252 total, 1 running, 251 sleeping, 0 stopped, 0 zombie
%Cpu(s): 0.0 us, 0.2 sy, 0.0 ni, 99.8 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
KiB Mem : 3861292 total, 1468624 free, 1196240 used, 1196428 buff/cache
KiB Swap: 4092 total, 4092 free, 0 used. 2379784 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
20888 cyan 20 0 116320 2892 1660 S 0.0 0.1 0:00.05 bash
21010 cyan 20 0 149048 4900 2556 S 0.0 0.1 0:00.17 vim
在命令行中运行top命令时,如果需要找出使用CPU最多的进程,按P
键,可以按CPU使用率来降序显示。在Linux系统中的一个进程,最多可以使用100%CPU,对吗?不对,如果是4核心CPU的话,CPU运行率可以达到400%。
四、查看进程打开的文件lsof
lsof 命令用于查看你进程开打的文件,打开文件的进程,进程打开的端口(TCP、UDP)
-i
<条件>:列出符合条件的进程,ipv4 或 ipv6、协议、端口等。
-p
<进程号>:列出指定进程号所打开的文件;
[root@centos7 ~]#ps -axu | grep 889900
cyan 21110 0.0 0.1 149048 4928 pts/1 S+ 22:58 0:00 vim 889900.txt
root 21287 0.0 0.0 112808 968 pts/2 R+ 23:14 0:00 grep --color=auto 889900
[root@centos7 ~]#lsof -p 21110 ##一般用于查看木马进程,在读哪些文件
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
vim 21110 cyan cwd DIR 8,2 4096 69 /root
vim 21110 cyan rtd DIR 8,2 4096 64 /
vim 21110 cyan txt REG 8,2 2337216 35256610 /usr/bin/vim
vim 21110 cyan mem REG 8,2 61560 67308732 /usr/lib64
...
[root@centos7 ~]#lsof -i :22 ##用于查看端口,或查看黑客开启的后门端口是哪个进程在使用
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
sshd 1263 root 3u IPv4 28570 0t0 TCP *:ssh (LISTEN)
sshd 1263 root 4u IPv6 28572 0t0 TCP *:ssh (LISTEN)
sshd 19460 root 3u IPv4 110002 0t0 TCP centos7.9:ssh->192.168.31.1:pslicser (ESTABLISHED)
sshd 19465 root 3u IPv4 108257 0t0 TCP centos7.9:ssh->192.168.31.1:iadt (ESTABLISHED)
五、控制管理进程 kill
关闭进程的3个命令:kill、killall、pkill。
kill
命令通过指定PID关闭单个进程。命令使用格式:kill [信号] PID
。
killall
和pkill
命令用于关闭指定程序名的所有相关进程。
命令使用格式:killall 程序名。
命令使用格式:pkill 程序名。
killall 和 pkill 命令用于杀死指定名字的进程
Kill命令关闭进程是通过信号的方式来控制进程的。
kill -l 列出所有支持的信号
[root@centos7 ~]#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、常用信号
编号 | 信号名 | 作用 |
---|---|---|
1 | SIGHUP | 重新加载配置 |
2 | SIGINT | 键盘中断 |
3 | SIGQUIT | 键盘退出 |
9 | SIGKILL | 强制终止 |
15 | SIGTERM | 终止(正常结束),默认信号 |
18 | SIGCONT | 继续 |
19 | SIGSTOP | 停止 |
20 | SICTSTP | 暂停 |
案例一:杀死进程
指定PID
[root@centos7 ~]#ps aux | grep vim
root 18403 0.0 0.1 149264 5004 pts/0 S+ 19:25 0:00 vim 1.text
cyan 21110 0.0 0.1 149048 4928 pts/1 S+ 22:58 0:00 vim 889900.txt
root 21478 0.0 0.0 112812 964 pts/2 S+ 23:33 0:00 grep --color=auto vim
[root@centos7 ~]#kill -9 21110
指定PID关闭进程
指定服务
[root@centos7 ~]#killall sshd #把sshd相关的所有进程关闭。
[root@centos7 ~]#pkill sshd #把sshd相关的所有进程关闭。
其他示例
1)踢出一个从远处登录本机的用户
pkill -u 用户名
2)终止一个终端上的所有进程
pkill -t pts/2
3)终止一个终端上所有进程,并结束该终端
pkill -9 -t pts/2
六、进程的优先级 nice
Linux 进程调度多任务,每个CPU在一个时间点上只能处理一个进程,通过时间片技术,来同时运行多个程序。
由于不是每个进程都与其它进程同样重要,可告知进程调度程序为不同的进程使用不同的调度策略。
nice值越高:表示优先级越低,例如+18,容易将CPU使用量然给其它进程。
nice值越低:表示优先级越高,例如-20,此进程不倾向于让出CPU。
在top中显示的优先级有两个,PR值和nice值
NI: 实际nice值,可更改。
PR(nice+20): 将nice级别显示为映射到更大优先级队列,-20映射到0,+19映射到39,不可更改。
案例一:查看nice级别
[root@localhost ~]# ps axo pid,command,nice --sort=-nice
案例二:nice启动级别的设置
[root@centos7 ~]#sleep 6000 & #启动默认为0
[1] 21655
[root@centos7 ~]#ps axo command,pid,nice |grep sleep
sleep 60 21654 0
sleep 6000 21655 0
grep --color=auto sleep 21657 0
[root@centos7 ~]#nice -n 5 sleep 6000 & #指定启动级别为5
[2] 21659
[root@centos7 ~]#ps axo command,pid,nice |grep sleep
sleep 6000 21655 0
sleep 6000 21659 5
sleep 60 21667 0
grep --color=auto sleep 21669 0
[root@centos7 ~]#renice -15 21659 #更改现有进程的nice级别
21659 (process ID) old priority 5, new priority -15
[root@centos7 ~]#ps axo command,pid,nice |grep sleep
sleep 6000 21655 0
sleep 6000 21659 -15
sleep 60 21698 0
grep --color=auto sleep 21702 0
七、作业控制jobs
作业控制是一个命令行功能,允许一个shell实例管理多个命令。
如果没有作业控制,父进程fork()一个子进程后,将sleeping,直到子进程退出。
foreground(fg)
——前台进程是在终端中运行的命令,该终端为进程的控制终端。前台进程接收键盘发生的输入和信号,并允许从终端读取或写入到终端。
backgroup(bg)
——后台进程没有控制终端,它不需要终端的交互。看不见,但是在运行。
命令 | 功能 |
---|---|
& | 用在一个命令的最后,可以把这个命令放到后台执行 |
ctrl + z | 将一个正在前台执行的命令放到后台,并且暂停. |
jobs | 查看当前有多少在后台运行的进程.它是一个作业控制命令 |
fg (foreground process) | 将后台中的命令调至前台继续运行 |
bg(background process) | 将一个在后台暂停的命令,变成继续执行 |
案例一:查看jobs
[root@centos7 ~]#jobs
[1]- Running sleep 6000 &
[2]+ Running nice -n 5 sleep 6000 &
#+,-代表,使用fg时,默认调动至前台的进程。先是+,后是-
[root@localhost ~]# sleep 3000 &
[root@centos7 ~]#ps aux |grep sleep
root 21655 0.0 0.0 108052 352 pts/2 S Mar31 0:00 sleep 6000
root 21659 0.0 0.0 108052 356 pts/2 S< Mar31 0:00 sleep 6000
root 21850 0.0 0.0 108052 348 ? S 00:07 0:00 sleep 60
root 21852 0.0 0.0 112808 968 pts/2 R+ 00:08 0:00 grep --color=auto sleep
消灭后台进程 kill %1
root@centos7 ~]#kill %1
[root@centos7 ~]#jobs
[2]+ Running nice -n 5 sleep 6000 &
注意,“kill 1” 和 “kill %1” 不同,
前者终止PID为1的进程,
后者杀死作业序号为1的后台程序。
总结:
&
后台运行程序
jobs
查询后台
kill %1
停止后台进程