一、进程
程序由一条条指令构成,在运行一个程序的时候就是把这些指令从第一条执行到最后一条,而进程是一个正在运行的程序。
比如说,一个main.c文件是不可以直接运行的,对main.c进行编译链接之后生成一个main.exe(在Windows系统中)或main(在Linux系统中),这里的main.exe或者main叫做可执行程序,这个可执行程序是二进制的。所以,其实程序是一个二进制文件,计算机把它运行或者执行起来,它就会产生一个进程。操作系统管理这些进程。
每一个进程都有一个id号为pid,这个pid就是用来唯一标识一个进程的,每个进程的id都是唯一的。
二、进程管理命令
1.ps
命令,默认显示与当前终端有关的进程信息
(1)ps
显示的是当前终端中所运行的进程,而不是整个系统所运行的进程:
从显示的结果可以看出,当前终端中有2个进程,bash打印的内容为:
ps打印的就是当前终端的进程信息。
【注意】执行3次ps:
我们可以发现,ps进程的id号逐渐变大,这是因为在第一个ps进程结束以后,它对应的id就会被释放出来,释放出来的id号可以被别的进程再次使用,被复用,但是并不是刚释放出来就被别的进程去使用;当第二次再运行ps时,它的id号会在原有的基础上增加,当id值一直增加到它的最大值以后,才会后头重新寻找没有被使用的id值,也就是被释放出来的id值。
(2)ps -f
,显示更多的进程属性信息(全格式),即详细信息。
(3)ps -e
,显示系统中所有的进程信息。我们发现第一个进程的编号是从1开始:
(4)ps -ef
,显示系统中所有的进程的详细信息:
(5)ps -L
,显示进程中的线程ID,LWP就代表线程id:
2.sleep n
,表示睡眠(阻塞)n秒钟。
重新打开一个终端,输入sleep 400
,表示睡眠400秒:
再回到之前打开的终端输入ps
,并不能看到刚刚重新打开的终端中的sleep进程:
输入ps -ef
来查看系统中所有进程的详细信息,这时我们就可以看到刚刚在新的终端中运行的sleep进程:
但是这样很麻烦,我们可以通过管道和过滤来查看,ps -ef | grep "sleep"
:
这样就非常方便。
3.Ctrl+c
用来结束前台运行进程
结束刚刚sleep 400的进程:
4.kill
命令
(1)kill pid
结束或者挂起一个进程,后台和前台的进程都可以通过kill来结束。
先重新打开一个终端,输入sleep 600,表示睡眠600秒:
然后在另一个终端找到刚刚创建的新的终端中进程sleep的id:
可以看到整个进程的id是3451。
然后输入kill 3451,表示通过id号来结束整个进程:
(2)kill -9 pid
,强制结束进程
在一个终端中输入sleep 400
,表示睡眠400秒,然后按Ctrl+z停止这个进程:
查看当前终端中的所有进程,发现sleep还在:
然后通过kill ipd
去结束这个进程,发现结束不了:
这时就需要通过kill -9 pid
强制结束这个进程:
(3)kill -stop pid
,挂起一个进程。
5.命令 &
,表示这个进程在后台运行
如果该进程在后台运行,我们在终端就还可以进行操作,比如说上面的ps
命令查看进程信息;但是如果该进程在前台运行,那么我们在终端不能进行操作,只有在该进程结束后,才能进行其他操作。
6.pstree
命令,以树状图形式显示进程之间的关系
7.jobs
命令,显示当前后台的任务
如下图所示,当前后台没有任务:
创建一个在后台执行的进程,然后通过jobs来显示当前后台的任务:
8.前台和后台之间的切换
(1)fg %任务号
将后台运行的或挂起的进程挪到前台执行:
(2)bg %任务号
将挂起的进程唤醒到后台执行
先在前台创建一个睡眠400秒的进程:sleep 400
,然后通过Ctrl+z停止这个进程:
然后通过jobs
命令显示后台的进程,发现sleep 400这个进程的状态是停止:
这时,通过bg %任务号
,将停止的进程sleep 400唤醒到后台执行: