首页 > 教程 > FreeBSD 教程 > FreeBSD 基础 > FreeBSD 进程和守护进程

FreeBSD 进程和守护进程

FreeBSD 是一个多任务操作系统,即同时可以运行多个程序。在系统中正在运行的程序都称为进程,每个程序至少启动一个新进程。

每个进程由一个进程 ID (PID) 进行唯一标识。与文件相似,每个进程都有一个所有者和组,根据所有者和组的权限来确定进程能够访问哪些文件和设备。大多数的进程都有一个启动它们的父进程。如,当前运行的 shell 是一个进程,在 shell 中启动的命令都是一个进程,命令进程的父进程就是 shell 进程。init 进程是一个例外,它没有父进程,它是引导程序启动的第一个进程,PID 为 1。

有些程序不是用来一直接受用户的输入,而是断开与用户的连接,在后台运行。如 web 服务器响应 web 请求,而不是用户输入;邮件服务器也是一样,这类程序称为守护进程。

守护进程有一个命名约定(是约定俗成,而不是规定,也就是说不是强制性的)程序名一般以 d 结尾。如 Apache Web 服务器程序是 httpd,行式打印机假脱机守护进程是 lpd。也有少数守护进程不是以 d 结尾,Sendmail 应用程序的主要邮件守护进程是 sendmail,而不是 maild。

查看进程

要查看系统上运行的进程,可以使用 pstop

  • 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 与进程或守护进程进行通信,发送信号。

有两个信号可用于停止进程:SIGTERMSIGKILL

  • SIGTERM 是终止进程的友好方式,进程可以读取该信号,关闭它已打开的日志文件,执行完正在执行的操作后关闭进程。在某些情况下,如果进程正在执行无法中断的任务,它会忽略 SIGTERM
  • SIGKILL 不能被进程忽略。向进程发送 SIGKILL 后会立即终止进程。