第6学时 进程
6.1 启动一个进程
在UNIX中无论何时执行一个命令,它都创建或启动一个新进程。
例如:当使用ls命令列一个目录内容时,就启动一个进程。
操作系统使用一个叫做pid或进程ID的5位数字ID来跟踪进程。系统中每个进程都有一个唯一的pid。
pid最终可能重复是因为所有可能的数字都被用完,所以下一个pid又从头开始。
在任何时刻,系统中没有两个相同的pid进程,因为pid是UNIX用来跟踪每个进程的。
6.1.1.前台进程
缺省下,用户启动的每个进程都在前台运行。进程从键盘得到输入并把输出送到屏幕上。
在运行命令时,不能运行其他命令(启动任何其他进程)。这时可以输入命令,但由于UNIX键盘输入缓冲区的原因,
直到前面命令执行完后才会显示出来。
UNIX提供一些措施来在后台启动进程、悬挂前台进程和在前台和后台之间移动进程。
6.1.2 后台进程
一个后台进程运行时不必与键盘连接。如果后台进程要求键盘输入,则进行等待。
在后台运行一个进程的优点是用户可以运行其他命令,用户不需要等待一个进程完成再启动另一个。
启动一个后台进程最简单的方式是在命令的后面增加一个&符号
例如:$ ls cho*.doc &
要求输入的后台进程
如果用户运行一个要求输入的后台进程,而且没有把它重定向为用读文件来代替键盘输入,则进程停止。
如果用户把进程和任务监测置为可用,则在一个空命令提示符后按Enter或启动一个命令时会返回一个信息。
1.把一个前台进程移动到后台
除了使用&在后台运行一个进程外,用户还可以把一个前台进程移动到后台。
一个前台进程运行时,Shell不处理任何新命令。用户在输入新命令前,必须悬挂前台进程得到一个提示符。
当前台进程被悬挂时,有一个命令提示符可以让用户输入其他命令,原来的进程仍在内存中,但不占用CPU时间。
要恢复前台进程有两个选择---后台和前台。
bg命令使用户能把悬挂进程置到后台;fg命令则可以把进程返回到前台。
使用CTRL+Z,停止一个进程。bg恢复一个进程。
2.把一个后台移动到前台
当有一个进程在后台或是悬挂,用户可以使用fg命令把它移动到前他。
缺省下,最后一个被悬挂或移动到后台的进程将被移到前台。
3。使后台进程保持继续运行(nohup命令)
当退出系统或连接意外中断时,用户可以防止一个后台进程终止。nohup命令可以防止用户的进程受到HUP信号,从而进程可以
只需将nohup放在运行命令的前面即可。
由于nohup被设计为无终端时运行,所以它希望用户把输出重定向到一个文件中。如果不这样做,nohup自动重定向到一个
叫做nohup.out中。
4.等待后台进程结束(wait命令)
在做其他事情前等待一个进程结束有两种方法。用户可以隔几分钟按一下enter,直到得到一个完成的信息。或使用wait命令
使用wait有三种方式--无选项、使用进程ID、使用加%号前缀的任务标号
例如:$ wait %1
这时不能输入其他命令,直到任务结束。
6.2 列出正在运行的进程
用户可以在前台或后台启动一个进程,悬挂他们,并在前台和后台之间移动,但怎么才能知道正在运行的是哪些进程呢?
可以使用jbos或ps命令;
6.2.1 ps命令
在缺省情况下,它显示正在运行的进程。它还可以接受许多不同选项。
对每个正在运行的进程,它提供四条信息:pid、TTY(进程运行的终端)、进程消耗的CPU时间、以及运行的命令名。
ps中-f选项是最长用的,它提供更多的信息
信息列表如下:
列名 描述
UID 进程所属用户ID
PID 进程ID
PPID 父进程ID(启动它的进程ID)
C 进程使用CPU时间
STIME 进程开始时间
CMD 启动该进程的命令
6.3 杀死一个进程(kill命令)
$ kill %1
%1表示任务号
用户可以使用进程ID而不是加%的任务标号来杀死一个特定进程。要使用进程ID来杀死进程,可以使用命令:
$ kill 6639 #(PID号)
6.4 父进程和子进程
在上面$ ps -f例子中,每个进程被赋予两个ID:进程ID(pid)和父进程ID(ppid)。系统中的每个用户进程都有一个父进程。
用户运行的大部分命令把Shell当作父进程。
Shell的父进程通常是操作系统或终端通信进程。
6.4.1 任务ID和进程ID
后台进程和悬挂进程通常由任务标号操作,这个数字与进程ID不同,它是因为较短才被使用。
6.4.2 SubShells
当用户运行Shell脚本时,除了脚本中的任何命令外,还创建了另一个Shell解释器的拷贝。
新Shell被称为一个SubShells,就像一个目录包含在另一个目录下时成为子目录一样。
例如:shell脚本文件psit
#! /bin/ksh
ps -ef | grep root
exit 0
当运行时,psit的返回结果是:
$ psit
root 9830 3662 0 22:57:00 pts/6 0:00 ksh psit
root 9831 9830 0 22:57:01 pts/6 0:00 ps -ef
root 9832 9830 0 22:57:01 pts/6 0:00 grep root
root 3662 3657 0 22:57:01 pts/6 0:00 -ksh
从上看出,当运行psit此脚本文件时,会生成一个父进程 ksh psit,其中执行的命令都将成为其子进程。