进程是操作系统中非常核心的概念,可以说没有进程就没有操作系统,两者不可分离。进程是替用户完成某种任务的执行实体,在linux当中看到的进程和线程其实是同样的东西,但还是有区别,即使用轻量级进程来实现线程。
系统结构:
内核----模块----进程----线程
从rhel7开始,第一个进程是systemd,pid为1,rhel5、rhel6第一个进程是init,pid为1。
查看进程命令:ps (progress status)、top、pstree(树形结构显示 -p显示pid) ps是显示瞬间行程的状态,并不动态连续,如果想对进程运行时间监控,应使用top工具
进程状态:(使用man ps 搜索state,可以查看)
D 不可中断式睡眠,不能杀死该进程,该状态通常是I/O出现问题的时候,比如一个进程去底层读取文件,由内核帮它读取,内核调用驱动,如果硬件出现问题,应用层的进程就会等待,而I/O无法读取文件,等待久了就成了状态D
R 正在运行的进程或正在运行队列里的进程,正常的进程
S 进程普通睡眠,该进程在等待一个事件或者其他进程将其唤醒,可中断式睡眠
T (stoped)进程被暂停
W 从内核2.6开始该进程就已经无效了
X(dead)进程已经死掉了
Z (zombie) 僵尸进程。理论上讲,每一个进程被kill掉都会经历该状态,然后由父进程回收。而没有被父进程回收掉的资源就处于了僵尸进程
如果进程状态后有一个+,表示该进程位于后台进程组,<代表优先级高的进程,N代表优先级低的进程,s表示内存页被锁定,S代表进程的领导者,在它之下还有子进程
ps命令讲解:
ps 可以加选项,也就是-xxx,也可以不加,习惯上也是不加的,不加更详细 ,如ps -a 和 ps a,后者查看的更详细
-a 查看所有终端进程
-u 进程所属用户
-x 后台进程
-o 指定查看的选项
所以一般查看进程的命令是ps aux
ps -o pid,comm,%cpu,%mem 查看进程的pid,名称,消耗的cpu,占用的内存
还可以使用pgrep命令过滤进程,如 pgrep -u root sshd 查看root用户的sshd程序的进程
查看进程pid: pidof 进程
控制进程:
kill -l 列出所有的信号,常用的信号有:
1 重新初始化进程。如修改了服务的配置,要想其生效但不想重启,kill -1 pid
2 键盘中断(ctrl+c)
9 杀死一个进程,比较暴力。 kill -9 $(pidof 进程)
10 当使用dd命令备份数据的时候,如,dd if=/dev/zero of=/dev/null,想查看其进度可以kill -10 $(pidof dd)
15 默认信号,终止
18 继续进程
19 暂停进程
20 键盘停止(ctrl+z)
可以使用kill命令给进程发送信号
后台进程
比如当我们打开firefox浏览器的时候,终端输入命令firefox,这时可以看到终端已经不能操作了,使用firefox & 命令,将该进程放入后台进程,任何命令都可以在后台进行
jobs命令用于显示后台任务列表
把一个程序放入后台并暂停任务,如:
[root@desktop0 ~]# sleep 5000 ctrl+z
^Z
[1]+ Stopped sleep 5000
激活暂停的后台任务,先使用jobs查看后台任务列表,再使用bg 任务编号命令
[root@desktop0 ~]# jobs
[1]+ Stopped sleep 5000
[root@desktop0 ~]# bg 1
[1]+ sleep 5000 &
[root@desktop0 ~]# jobs
[1]+ Running sleep 5000 &
把后台进程放入前台执行:
[root@desktop0 ~]# fg 1
sleep 5000
杀掉后台某个任务:
kill %1