FreeBSD 进程和守护进程
FreeBSD 是一个多任务操作系统,即同时可以运行多个程序。在系统中正在运行的程序都称为进程,每个程序至少启动一个新进程。
每个进程由一个进程 ID (PID) 进行唯一标识。与文件相似,每个进程都有一个所有者和组,根据所有者和组的权限来确定进程能够访问哪些文件和设备。大多数的进程都有一个启动它们的父进程。如,当前运行的 shell 是一个进程,在 shell 中启动的命令都是一个进程,命令进程的父进程就是 shell 进程。init 进程是一个例外,它没有父进程,它是引导程序启动的第一个进程,PID 为 1。
有些程序不是用来一直接受用户的输入,而是断开与用户的连接,在后台运行。如 web 服务器响应 web 请求,而不是用户输入;邮件服务器也是一样,这类程序称为守护进程。
守护进程有一个命名约定(是约定俗成,而不是规定,也就是说不是强制性的)程序名一般以 d 结尾。如 Apache Web 服务器程序是 httpd,行式打印机假脱机守护进程是 lpd。也有少数守护进程不是以 d 结尾,Sendmail 应用程序的主要邮件守护进程是 sendmail,而不是 maild。
查看进程
要查看系统上运行的进程,可以使用 ps 或 top:
ps命令能够显示出当前运行进程的 PID、内存使用大小、启动程序的命令。top命令能够显示所有正在运行的进程并会自动刷新。
使用 ps 命令查看进程
默认情况下,ps 命令只显示当前用户的进程:
% ps
输出类似于以下内容:
PID TT STAT TIME COMMAND
8203 0 Ss 0:00.59 /bin/csh
8895 0 R+ 0:00.00 ps
ps 的输出是每行一条进程信息,进程信息由多列展示:
PID列显示进程 ID;PID 从 1 开始分配,直到 99999,然后再从头开始。在从头开始时,如果 PID 已被使用,则跳过。TT列显示程序运行在哪个 tty 中。- STAT 显示程序的状态。
- TIME 是程序在 CPU 上运行的时间,不是启动后的时间,如果程序启动后就能够获取到 CPU,则是一致的,然而有些程序启动后会进入队列,等待调度,这时启动时间和在 CPU 上运行的时间就不同啦。
- COMMAND 是启动程序的命令。
可以使用选项显示不同的信息,常用的选项组合是 auxww:
a显示所有用户的进程信息u显示进程所有者的用户名和内存使用情况x显示守护进程的信息ww是始终显示每个进程的完整命令行,而不会因为太长而显示部分信息
使用 top 命令查看进程
运行 top 命令查看进程:
% top
输出类似于以下内容:
last pid: 9609; load averages: 0.56, 0.45, 0.36 up 0+00:20:03 10:21:46
107 processes: 2 running, 104 sleeping, 1 zombie
CPU: 6.2% user, 0.1% nice, 8.2% system, 0.4% interrupt, 85.1% idle
Mem: 541M Active, 450M Inact, 1333M Wired, 4064K Cache, 1498M Free
ARC: 992M Total, 377M MFU, 589M MRU, 250K Anon, 5280K Header, 21M Other
Swap: 2048M Total, 2048M Free
PID USERNAME THR PRI NICE SIZE RES STATE C TIME WCPU COMMAND
557 root 1 -21 r31 136M 42296K select 0 2:20 9.96% Xorg
8198 dru 2 52 0 449M 82736K select 3 0:08 5.96% kdeinit4
8311 dru 27 30 0 1150M 187M uwait 1 1:37 0.98% firefox
431 root 1 20 0 14268K 1728K select 0 0:06 0.98% moused
9551 dru 1 21 0 16600K 2660K CPU3 3 0:01 0.98% top
2357 dru 4 37 0 718M 141M select 0 0:21 0.00% kdeinit4
8705 dru 4 35 0 480M 98M select 2 0:20 0.00% kdeinit4
8076 dru 6 20 0 552M 113M uwait 0 0:12 0.00% soffice.bin
2623 root 1 30 10 12088K 1636K select 3 0:09 0.00% powerd
2338 dru 1 20 0 440M 84532K select 1 0:06 0.00% kwin
1427 dru 5 22 0 605M 86412K select 1 0:05 0.00% kdeinit4
输出分为两部分。
第一部分是标头内容占前五行或六行,其内容为:
- 第一行的内容:最后一个进程的 PID、系统负载平均值(衡量系统繁忙程度的指标)、系统运行时间和当前时间。
- 第二行的内容:进程数及其运行情况
- 第三行的内容:CPU 的使用情况
- 第四行的内容:内存的使用情况
- 第五行的内容:文件系统为 ZFS 时,为 ARC 行,显示从内存缓存读取的数据量;为其他类型文件系统时,显示交换空间的使用情况。
- 第六行的内容:文件系统为 ZFS 时,显示交换空间的使用情况。
第二部分是进程信息(与 ps 命令的输出信息相似): PID、用户名、CPU 时间量以及启动进程的命令。默认情况下,top会分两列显示占用的内存空间量,一列为总大小,一列为驻留大小;总大小是应用程序需要的内存量,驻留大小是它当前实际使用的内存量。
top 默认每两秒更新一次显示,可以使用 -s 指定不同的时间间隔。
终止进程
可以使用 kill 与进程或守护进程进行通信,发送信号。
有两个信号可用于停止进程:SIGTERM 和 SIGKILL:
SIGTERM是终止进程的友好方式,进程可以读取该信号,关闭它已打开的日志文件,执行完正在执行的操作后关闭进程。在某些情况下,如果进程正在执行无法中断的任务,它会忽略SIGTERM。SIGKILL不能被进程忽略。向进程发送SIGKILL后会立即终止进程。