24 FreeBSD连载:查看系统状态( 二 )


从上面的ps的输出结果可以看出,有些程序没有控制终端,这些程序通常是一些后台进程 。使用命令nohup当然可以启动这样的程序,但nohup启动的程序在进程执行完毕就退出,而常见的一些服务进程通常永久的运行在后台,不向屏幕输出结果 。在Unix中这些永久的后台进程称为守护进程(daemon) 。守护进程通常从系统启动时自动开始执行,系统关闭时才停止 。如果偶然某个守护进程消失了,那么它提供的服务将不再能被使用 。
在守护进程中,最重要的一个是超级守护进程inetd,这个进程接管了大部分网络服务,但并不是对每个服务都自己进行处理,而是依据连接请求,启动不同的服务程序与客户机打交道 。inetd支持网络服务种类在它的设置文件/etc/inet.conf中定义 。inet.conf文件中的每一行就对应一个端口地址,当inetd接受到连接这个端口的连接请求时,就启动相应的进程进行处理 。使用inetd的好处是系统不必启动很多守护进程,从而节约了系统资源,然而使用inetd启动守护进程相应反应会迟缓一些,不适合用于被密集访问的服务进程 。
当用户希望要停止一个进程时,如果进程在前台运行并接收输入的条件下,可以输入^D,告诉进程输入结束,通常这意味着需要进程进行的处理要结束了,从而通知进程结束 。对于有些不以文件输入结束作为结束标志的进程,那么就可以使用^C来向进程发送信号中断进程 。
如果上述方式均无效,或者进程运行在后台或者是一个守护进程,则需要手工向进程发送信号,这可以通过kill命令来做到 。使用 “kill PID” 来向进程发送终止信号SIGTERM,这个信号告诉进程需要退出 。但是这些发送的信号都能被程序通过编程的手段捕获并对其进行处理,一旦程序在这个处理过程中没有退出,而是忽略这个信号的情况下,就无法杀死进程 。这时只能使用 “kill -9 PID” 向PID代表的进程发送SIGKILL信号,这个信号不能被进程本身捕获,从而无条件杀死进程 。但是最好先首先发送SIGTERM信号终止进程 。而很多守护进程能够捕获SIGHUP挂线信号,会根据这个信号进行处理,例如重新读入配置文件,重新刷新进程本身等,因此可以再更改进程的配置文件之后,使用 “kill -HUP pid” 刷新进程的配置 。
kill命令需要使用进程的标识号PID,因此需要首先运行ps以得到这个标识号 。而FreeBSD下可以使用程序的名字来给进程发送信号,这个命令为killall,对于大部分情况,它使用起来更为方便 。
查看系统状态
FreeBSD下提供了相当丰富的工具可以用来查看系统的状态,使用者可以通过它们来了解系统状态,从而优化系统性能 。这些工具通常读取/dev/mem、/dev/kmem来获得内存中的系统信息,使用/kernel将这些信息中的变量转换为名字 。最基本的查看系统状态的命令为ps,用于报告当前系统中运行的进程的状态 。
pstat能显示系统中打开的文件数量、交换设备的使用率等系统信息 。pstat缺省使用/dev/mem设备文件,从系统内存中读取这些数据,或者可以指定一个core文件,那么pstat从这个文件中读取数据 。还需要给pstat一个参数来告诉pstat应该显示那种系统信息,通常使用 “pstat -f” 显示出当前打开文件的列表,“pstat -s” 显示交换设备的当前状态,“pstat -t” 显示当前使用的终端设备文件的状态,“pstat -v” 显示激活的v节点的当前状态 。“pstat -T” 显示这几个系统表的状态,包括当前使用的和可以利用的系统表空间,因此可以用来检查系统在当前负载下是使用多大的系统表,帮助进行优化系统性能 。
$ pstat -T
69/8232 files
4M/137M swap spacevmstat报告内核的统计信息,包括进程、虚存、处理器、磁盘等 。可以使用 “-w” 参数指定每隔几秒时间,报告一次系统状态 。

推荐阅读