本章将详细讨论Unix中的进程管理。
进程是正在运行的程序实例。
操作系统通过一个称为pid/进程ID的五位数跟踪进程,每个进程都有唯一pid。
启动进程
当你启动一个进程(运行一个命令)时,有2种启动方式:
- 前台进程
- 后台进程
前台进程
默认情况下每个进程都在前台运行,前台进程有键盘输入和屏幕输出。
以ls
命令为例:
[kevin@localhost ~]$ ls
book test1
列出目录下文件,输出显示在屏幕上了,如果ls
需要任何输入(它不需要),就会等待键盘输入。
命令行上前台进程同一时间只能运行一个,因为在一个前台进程结束之前不能再输入命令执行。
后台进程
后台进程运行时没有键盘输入,如果需要任何键盘输入它将等待。使用后台进程的好处是可以同时运行其他命令,可以通过在命令末尾添加&
启动后台进程。
[kevin@localhost ~]$ ls &
[1] 3539
[kevin@localhost ~]$ book test1
如上所示,列出目录下文件,以后台进程方式启动。在这里,如果ls
命令需要任何输入(它不需要),将进入停止状态,直到被移到前台,接受键盘输入后将继续执行。
[1] 3539
中,前面[1]
是作业编号,后面3539
是进程ID,作业编号可用于进程的前后台切换。
按下回车键:
[1]+ 完成 ls --color=auto
可以看到ls
命令成功完成。
列出进程
运行ps (process status)命令可看用户自己的进程,如下所示:
[kevin@localhost ~]$ ps
PID TTY TIME CMD
3490 pts/1 00:00:00 bash
3563 pts/1 00:00:00 ps
ps
常用的标志之一是-f
(f代表full)选项,提供更详细的信息,如下所示:
[kevin@localhost ~]$ ps -f
UID PID PPID C STIME TTY TIME CMD
kevin 3490 3489 0 09:48 pts/1 00:00:00 -bash
kevin 3564 3490 0 10:28 pts/1 00:00:00 ps -f
下面是ps -f
命令显示的所有字段描述:
序号 | 字段 |
---|---|
1 |
UID 进程所属的用户ID(运行它的人) |
2 |
PID 进程 ID |
3 |
PPID 父进程ID(启动它的进程的ID) |
4 |
C 进程的CPU利用率 |
5 |
STIME 进程开始时间 |
6 |
TTY 与进程关联的终端类型 |
7 |
TIME 进程占用的CPU时间 |
8 |
CMD 启动此进程的命令 |
ps
命令还有其他一些常用选项:
序号 | 选项 |
---|---|
1 |
-a 显示现行终端机下的所有进程,包括其他用户的进程 |
2 |
-x 通常与 a 这个参数一起使用,可列出较完整信息 |
3 |
-u 以用户为主的进程状态 |
4 |
-e 所有的进程均显示出来 |
5 |
-l 较长、较详细的将该PID 的的信息列出 |
6 |
-j 作业的格式 (jobs format) |
结束进程
前台进程可以用CTRL + C
退出。
后台进程可以通过kill PID
命令杀死进程,可以通过ps
命令获知PID/进程ID。
[kevin@localhost ~]$ ps
PID TTY TIME CMD
3490 pts/1 00:00:00 bash
3634 pts/1 00:00:00 vim
3635 pts/1 00:00:00 ps
[kevin@localhost ~]$ kill -9 3634
[kevin@localhost ~]$ ps
PID TTY TIME CMD
3490 pts/1 00:00:00 bash
3638 pts/1 00:00:00 ps
[1]+ 已杀死 vim test2
在这里,kill -9
中的-9
是强制杀死进程,如果没有-9
选项,有时进程会忽略kill
命令。
父进程和子进程
除了初始(init)进程,所有进程都有父进程,用户运行的大多数命令的父进程是shell,可以通过ps -f
命令查看进程的父进程ID(PPID)。
僵尸进程和孤儿进程
一个进程已经结束,但进程列表中仍然存在(进程状态标为Z/zombie僵尸),这个进程是无效的,被称为僵尸进程。
一个进程的父进程被杀死,它的父进程变为初始(init)进程,该进程被称为孤儿进程,这与僵尸进程是不一样的。
守护进程
守护进程是系统相关的后台进程,通常具有root权限,为其它进程提供服务。
守护进程类似windows平台上的后台服务,如打印机守护进程。守护进程没有控制终端,无法打开/dev/tty
设备文件,如果执行ps -ef
查看守护进程的tty字段,可以看到都是问号?
。
如果你的程序需要长时间运行,就可以让其成为守护进程运行。
top命令
top
命令类似windows上的任务管理器,可以查看所有进程的内存、CPU使用情况、平均负载和繁忙进程等信息。
top
命令语法
$ top
作业
作业是用户提交给系统的一个任务,一个作业通常包括几个进程,几个进程共同完成一个任务,即作业。
可以使用作业ID(通常比进程ID更短)管理作业,如前后台切换,杀死作业等。