在
Linux系统中,每个执行的任务都称为
进程(Process),例如使用ls命令浏览目录内容,或查询日期时间输入的date命令。同时,在每个进程
启动时,
系统
都会给它指定一个惟一的数值,这个数值就称为“进程ID”(Process ID,PID)。如果要针对某个进程进行管理,例如结束进程的执行,必须以进程ID(而不是该进程的名称)作为参考的对象。
每个进程都会存在一个对应的父进程(Parent Process),而由这个父进程可以复制多个子进程,这是网络程序编写时很常用的一种方式,这个动作就称为Fork,如图12-1所示。
最常见的一个Fork例子就是 Web服务器,Web服务器通常都可以支持多个客户端的连接,而服务器方面利用一个父进程来接受客户端的请求,然后利用Fork来产生一个子进程以处理后续的任务,之后该父进程就可再度回到等待客户端请求的状态,如此即可不断地为客户端服务。
前台与后台进程
每个进程都可能以两种方式存在:前台(Foreground)与后台(Background)。所谓前台进程,就是用户目前在 屏幕 上进行操作的进程;而后台进程则是实际上在操作,但由屏幕上并无法看到的进程。
通常使用后台方式执行的情况是,当此进程较为复杂且必须执行较长的 时间 时,我们会将它置于后台中执行,以避免占用屏幕的时间过久,而无法执行其他的进程。
系统的服务一般都是以后台进程的方式存在的,而且都会驻留在系统中,直到关机时才结束,这类服务我们也称为Daemon,在Linux系统中就包含许多Daemon。
判断Daemon最简单的方法就是由名称来判断,多数Daemon都是由服务名称加上d来产生的,例如 HTTP服务的Daemon为httpd。
显示 目前进程
ps命令是Process Status的缩写,它的功能是查看目前的系统中有哪些进程正在执行,以及它们的执 行情 况。您可以直接输入ps命令名称而不加任何参数。
如果直接执行ps命令,则会出现类似以下的信息:
上述ps命令显示的数据共分为4个字段,它们的说明如下:
PID:进程标识(Process ID),系统即是凭着这个编号来识别及处理此进程的。
TTY:Teletypewriter,登录的终端机编号。
TIME:此进程所消耗的 CPU时间。
CMD:正在执行的命令或进程名称。
上述的信息是ps命令显示的最基本数据画面,其实ps支持非常多的参数。因为ps是非常常用的命令,所以本书在此将说明其中较为重要的参数的使用方法。
显示详细信息
如果需要更详细的系统数据,可以使用-l(Long)参数,它除了显示ps命令的4个基本字段数据外,另外还有10个额外数据可供查看,这些额外数据的内容及说明如下:
F:该进程状态的标志(Flag),表12-1是较常用的标志及说明。
表12-1 进程状态标志说明
标 志 名 称 标 志 代 码 说 明
ALIGNWARN 001 打印警告信息
STARTING 002 进程正在初始化
EXITING 004 系统正在关机
PTRACED 010 表示已调用ptrace(0)
TRACESYS 020 跟踪System Call
FORKNOEXEC 040 已执行fork但没有执行exec
SUPERPRIV 100 以root身份执行
DUMPCORE 200 内核转储
SIGNALED 400 以Signal结束进程
?S:进程状态代码(Process State Codes),可用的代码及说明如表12-2所示。
表12-2 进程状态代码说明
代 码 说 明
D 不可中断的闲置状态(Uninterruptible Sleep)
R 可执行的
S 闲置状态
(续)
代 码 说 明
T 跟踪或停止
Z 已死亡的进程(Zombie)
W 没有足够的 内存页可分配
< 高优先级的进程
N 低优先级的进程
L 有内存页分配并锁在内存内
UID:进程执行者的ID(User ID)。
PPID:父进程标识(Parent Process ID)。
PRI:进程执行的优先级(Priority)。
NI:nice,是指进程执行优先级的nice值,负值表示其优先级较高。
SZ:Size,进程所占用的内存大小,以KB为单位。
WCHAN:Waiting Channel,表示进程或系统调用等待时的地址。
而另一种显示详细内容信息的参数为-u(User),它的主要 功能 是将进程数据以用户的格式来显示,以下是部分的示例内容以及新的字段说明:
显示后台进程
其实,系统中目前执行的进程绝不是只有输入ps命令时的数目,事实上有为数更多的进程以后台的方式来执行,它们一般都是系统的服务(Daemon),或是用户利用&来处理的进程。如果要查看这些后台进程,可以使用-x参数,以下是部分的示例内容:
有经验的管理员一般都习惯一次查看所有用户执行的进程以及后台进程,此时可以使用-aux参数。
虽然-aux参数可以提供最详尽的信息,但是有时并不是很容易找出所需的信息,因此我们可配合使用grep命令,以缩小查看的范围。以下是找出与用户jack有关的进程及其内容的示例:
....
结束执行中的进程
如果某个进程执行到一半时中断,或消耗太多的系统资源,例如内存数量及CPU时间,此时您可以考虑使用kill命令来将指定的信号传送到该进程。
虽然kill命令可以传送的信号有很多种,但以SIGTERM(15)或SIGKILL(9)居多,它们都是用来结束进程执行的。您可以使用-l参数来查看所有可供传送的信号,如图12-2所示。
因为kill命令在使用时必须通过进程ID来指定信号的接收进程,所以需先以ps命令来得知要传送的PID,之后再使用kill命令加上指定的PID来送出终止信号以结束进程。
以下示例假设要终止PID 16525进程的执行:
[root@ns1 ~]# kill 16525
因为有些进程会捕捉某些信号,所以当直接指定PID无法终止其进程时,您可以使用-9参数,它代表送出SIGKILL信号。
[root@ns1 ~]# kill -9 16525
如果使用-9参数仍无法结束该进程,还可以尝试使用-15参数来送出SIGTERM信号;如果连-15参数都无法成功地删除此进程,则只有重新启动这一方法了。
通常,极难删除的进程大多与系统运行有关联,如果删除后可能会影响系统的性能或执行,因此最好不要养成直接使用-9和-15参数的习惯。
[root@ns1 ~]# kill -15 16525
kill命令另外一个常用的时机是,当对某个Daemon进行修改或设置后,您可以使用-HUP(Hang Up)参数来重新启动该进程,这可减少重新启动计算机的时间。
[root@ns1 ~]# kill -HUP 16525
每个进程都会存在一个对应的父进程(Parent Process),而由这个父进程可以复制多个子进程,这是网络程序编写时很常用的一种方式,这个动作就称为Fork,如图12-1所示。
图12-1 |
最常见的一个Fork例子就是 Web服务器,Web服务器通常都可以支持多个客户端的连接,而服务器方面利用一个父进程来接受客户端的请求,然后利用Fork来产生一个子进程以处理后续的任务,之后该父进程就可再度回到等待客户端请求的状态,如此即可不断地为客户端服务。
前台与后台进程
每个进程都可能以两种方式存在:前台(Foreground)与后台(Background)。所谓前台进程,就是用户目前在 屏幕 上进行操作的进程;而后台进程则是实际上在操作,但由屏幕上并无法看到的进程。
通常使用后台方式执行的情况是,当此进程较为复杂且必须执行较长的 时间 时,我们会将它置于后台中执行,以避免占用屏幕的时间过久,而无法执行其他的进程。
系统的服务一般都是以后台进程的方式存在的,而且都会驻留在系统中,直到关机时才结束,这类服务我们也称为Daemon,在Linux系统中就包含许多Daemon。
判断Daemon最简单的方法就是由名称来判断,多数Daemon都是由服务名称加上d来产生的,例如 HTTP服务的Daemon为httpd。
显示 目前进程
ps命令是Process Status的缩写,它的功能是查看目前的系统中有哪些进程正在执行,以及它们的执 行情 况。您可以直接输入ps命令名称而不加任何参数。
如果直接执行ps命令,则会出现类似以下的信息:
[root@ns1 ~]# ps |
PID:进程标识(Process ID),系统即是凭着这个编号来识别及处理此进程的。
TTY:Teletypewriter,登录的终端机编号。
TIME:此进程所消耗的 CPU时间。
CMD:正在执行的命令或进程名称。
上述的信息是ps命令显示的最基本数据画面,其实ps支持非常多的参数。因为ps是非常常用的命令,所以本书在此将说明其中较为重要的参数的使用方法。
显示详细信息
如果需要更详细的系统数据,可以使用-l(Long)参数,它除了显示ps命令的4个基本字段数据外,另外还有10个额外数据可供查看,这些额外数据的内容及说明如下:
[root@ns1 ~]# ps -l |
F:该进程状态的标志(Flag),表12-1是较常用的标志及说明。
表12-1 进程状态标志说明
标 志 名 称 标 志 代 码 说 明
ALIGNWARN 001 打印警告信息
STARTING 002 进程正在初始化
EXITING 004 系统正在关机
PTRACED 010 表示已调用ptrace(0)
TRACESYS 020 跟踪System Call
FORKNOEXEC 040 已执行fork但没有执行exec
SUPERPRIV 100 以root身份执行
DUMPCORE 200 内核转储
SIGNALED 400 以Signal结束进程
?S:进程状态代码(Process State Codes),可用的代码及说明如表12-2所示。
表12-2 进程状态代码说明
代 码 说 明
D 不可中断的闲置状态(Uninterruptible Sleep)
R 可执行的
S 闲置状态
(续)
代 码 说 明
T 跟踪或停止
Z 已死亡的进程(Zombie)
W 没有足够的 内存页可分配
< 高优先级的进程
N 低优先级的进程
L 有内存页分配并锁在内存内
UID:进程执行者的ID(User ID)。
PPID:父进程标识(Parent Process ID)。
PRI:进程执行的优先级(Priority)。
NI:nice,是指进程执行优先级的nice值,负值表示其优先级较高。
SZ:Size,进程所占用的内存大小,以KB为单位。
WCHAN:Waiting Channel,表示进程或系统调用等待时的地址。
而另一种显示详细内容信息的参数为-u(User),它的主要 功能 是将进程数据以用户的格式来显示,以下是部分的示例内容以及新的字段说明:
[root@ns1 ~]# ps -u |
其实,系统中目前执行的进程绝不是只有输入ps命令时的数目,事实上有为数更多的进程以后台的方式来执行,它们一般都是系统的服务(Daemon),或是用户利用&来处理的进程。如果要查看这些后台进程,可以使用-x参数,以下是部分的示例内容:
[root@ns1 ~]# ps -x |
虽然-aux参数可以提供最详尽的信息,但是有时并不是很容易找出所需的信息,因此我们可配合使用grep命令,以缩小查看的范围。以下是找出与用户jack有关的进程及其内容的示例:
[root@ns1 ~]# ps -aux | grep jack |
结束执行中的进程
如果某个进程执行到一半时中断,或消耗太多的系统资源,例如内存数量及CPU时间,此时您可以考虑使用kill命令来将指定的信号传送到该进程。
虽然kill命令可以传送的信号有很多种,但以SIGTERM(15)或SIGKILL(9)居多,它们都是用来结束进程执行的。您可以使用-l参数来查看所有可供传送的信号,如图12-2所示。
图12-2 kill命令可传送的信号 |
以下示例假设要终止PID 16525进程的执行:
[root@ns1 ~]# kill 16525
因为有些进程会捕捉某些信号,所以当直接指定PID无法终止其进程时,您可以使用-9参数,它代表送出SIGKILL信号。
[root@ns1 ~]# kill -9 16525
如果使用-9参数仍无法结束该进程,还可以尝试使用-15参数来送出SIGTERM信号;如果连-15参数都无法成功地删除此进程,则只有重新启动这一方法了。
通常,极难删除的进程大多与系统运行有关联,如果删除后可能会影响系统的性能或执行,因此最好不要养成直接使用-9和-15参数的习惯。
[root@ns1 ~]# kill -15 16525
kill命令另外一个常用的时机是,当对某个Daemon进行修改或设置后,您可以使用-HUP(Hang Up)参数来重新启动该进程,这可减少重新启动计算机的时间。
[root@ns1 ~]# kill -HUP 16525