1、什么是程序
要理解进程,首先要知道什么是程序,程序是保存在外部存储介质中的可执行的机器代码和数据的静态集合。说简单点就是具有执行代码和执行权限的文本文件,它只是被保存在硬盘中,不占用其他的系统资源。如图所示,拿passwd为例,它就是一个程序,它可以更改用户密码,它也是一个文件,一个可执行的文件
2、什么是进程
而进程就是运行起来的程序,它占用系统各方面的资源,如cpu、内存、网络、磁盘IO等。每个程序启动后可以创建一个或多个的进程,每个进程都有一个自己的PID,这个是随机产生的并且不是固定的,又有自己的进程状态,如running、sleeping等
3、进程的生命周期
每个进程它是由自己的父进程fork出来的子进程,相当于复制了一份出来,继承自己的父进程的一些资源如权限,内存空间等,当运行完毕之后告诉父进程自己结束了,父进程就会把它结束掉
4、进程的状态
常见状态:
- R—>运行状态
- S—>睡眠状态(可中断睡眠状态)
- T—>停止状态
- X—>死亡状态
- Z—>僵尸状态(表示在运行,但是有可能卡住了,未响应的状态)
5、管理进程
了解系统中进程的状态是对进程进行管理的前提,使用不同的命令工具可以从不同的角度查看管理进程
1、静态查看
ps命令是linux系统中最常用的进程查看工具,主要用于显示包含当前运行的各进程完整信息的静态快照
ps 选项(后跟aux最常用)
- a 当前终端下的所有信息
- u 使用以用户为主的格式输出进程信息
- x 显示当前用户在所有终端下的进程信息
- -e 显示系统内的所有进程信息
- -f 使用完整的格式显示进程信息
- -l 使用长格式显示进程信息
显示的参数:
- USER :进程的所属用户
- PID :唯一的进程号
- %CPU :进程占用的 CPU百分比
- %MEM :进程占用的 内存 百分比
- VSZ :进程使用的虚拟内存量 ,默认KB
- RSS :进程占用的固定的内存量 ,默认KB
- TTY :该进程运行在哪个终端上,一般用pts/0、pts/1等表示,?表示就是当前终端
- STAT :进程的状态
- START :进程开始的时间
- TIME :进程运行的总cpu时间
- COMMAND : 进程对应的程序名称或路径
ps axo user,pid
#自定义所需要的显示的参数
ps aux --sort -%cpu
#让cpu按降序排列
ps -elf | head
#查看系统所有进程并只显示前十行
pstree
#查看进程树,能更直观的判断各进程的父子关系,systemd是系统第一个进程,PID为1,其他的进程都是他的后代
- -a 列出完整的命令信息
- -u 列出对应的用户名
- -p 列出对应的PID
ps
#ps后面如果不跟任何选项,则只显示当前用户会话中打开的进程
ps aux | grep sshd
#还可以使用grep,过滤出你想要的进程信息
pgrep
通常我们要查出某个进程的PID号需要结合grep命令过滤,比较麻烦,用pgrep简便一些,可以指定进程的一部分名称进行查询
- -l 输出对应的进程名不只是PID
- -t 输出特定终端运行的程序
- -U 查询特定用户运行的程序
2、动态查看
使用ps命令查看到的是静态的进程信息,并不能连续的反馈当前进程的运行状态,如果希望以动态刷新的方式显示各进程的状态信息,就可以使用top命令。默认每3秒刷新一次,类似于Windows系统的任务管理器
top前五行信息解析:
-
top - 16:46:53 up 1 day, 17:17, 4 users, load average: 0.05, 0.03,
0.05当前时间,系统运行时间,当前登录用户数,系统负载,即任务队列的平均长度。 三个数值分别为 1分钟、5分钟、15分钟前到现在的平均值。
-
Tasks: 243 total, 1 running, 242 sleeping, 0 stopped, 0 zombie
进程总数,正在运行的进程数,睡眠的进程数,停止的进程数,僵尸进程数
-
%Cpu(s): 0.0 us, 0.1 sy, 0.0 ni, 99.9 id, 0.0 wa, 0.0 hi, 0.0
si, 0.0 st用户空间占用CPU百分比,内核空间占用CPU百分比,用户进程空间内改变过优先级的进程占用CPU百分比,空闲CPU百分比,等待输入输出的CPU时间百分比,硬中断(Hardware IRQ)占用CPU的百分比,软中断(Software Interrupts)占用CPU的百分比,虚拟机占用百分比
-
KiB Mem : 3861512 total, 900072 free, 780552 used, 2180888
buff/cache
物理内存总量,空闲内存总量,使用的物理内存总量,用作内核缓存的内存量 -
KiB Swap: 4064252 total, 4064252 free, 0 used. 2709176
avail Mem
交换分区总量,空闲交换分区总量,使用的交换分区总量,可用于进程下一次分配的物理内存数量
主要参数:
- PID 进程id
- USER 进程所有者的用户名
- PR 优先级
- NI nice值。负值表示高优先级,正值表示低优先级
- VIRT 进程使用的虚拟内存总量,单位kb。VIRT=SWAP+RES
- RES 进程使用的、未被换出的物理内存大小,单位kb
- SHR 共享内存大小,单位kb
- S 进程状态 R=运行 S=睡眠 T=跟踪/停止 Z=僵尸进程
- %CPU 上次更新到现在的CPU时间占用百分比
- %MEM 进程使用的物理内存百分比
- TIME+ 进程使用的CPU时间总计,单位1/100秒
- COMMAND 命令名/命令行
常用命令
进入top以后
h:查看选项参数
M:按物理内存占用大小排序
N:按PID大小降序排序
P:按cpu占用大小排序(top默认也是按cpu占用率大小排序的)
1:查看多个cpu的情况
z:彩色显示
q:退出top
top 选项
- -d 指定多长时间刷新,默认为秒
- -p 指定查看进程,后面跟进程号,多进程用逗号分隔
3、进程控制
1、启动进程
用户手工输入命令或者可执行程序的路径即可启动至少一个进程了,一般进程都是放在前台运行,占用当前的命令终端,等该进程执行结束并退出的时候才能继续输入其他命令,有些命令运行时间比较短,但是有的命令需要处理大量数据的话就需要占用很多时间,这时我们可以让他在后台启动运行,这样前台就不需要等他结束就可以运行其他命令了。
后台运行需要在命令结尾处加上“&”字符,同时会显示后台运行的任务号码及PID号:
jobs
#查看后台任务
-l 显示PID号
2、挂起进程
当前台在运行一个花费时间很长的程序,如果这时又有一个很紧急的事情需要去做,那么可以把当前程序挂起,把它调入后台并暂停执行
使用“ctrl+z”键挂起进程
bg
#将后台暂停的任务恢复在后台运行,如果不止一个程序,后面需要加任务序号,如bg 1
fg
#将后台的任务(不管暂停还是在运行的)恢复到前台运行,如果不止一个程序,后面需要加任务序号,如fg 1
如果直接fg,他运行的是最近的一次任务,bg也是一样的
3、终止进程
一般用户在前台执行某个进程时,可以按ctrl+c组合键强制进行中断,但当ctrl+c无法终止程序时,可以使用专门的进程终止工具kill、pkill和killall。
kill
#通过kill终止进程需要后面跟PID号作为参数
#杀后台作业任务的时候后面需要跟%作业序号
kill -9
#强制终止进程(慎用)
9是代表一种信号
kill -l可以查看所有信号
现在我们创建2个文件1和2,分别在2个终端用vi打开他们在里面随便输入内容,然后尝试用kill和kill -9杀死他们,观察有什么不同?
用kill杀死1,用kill -9杀死2
可以看出,用kill -9比较直接
killall
#杀死指定名字的所有进程,后面也可跟信号比如-9,后面跟进程名
pkill
#大部分选项与pgrep相似,如-t、-U也可以-9