让我们先来看一些常用的系统守护进程,以及它们是怎样和第9章中叙述的进程组、控制终端和会话这三个概念相关联的。ps(1)
命令打印系统中各个进程的状态。该命令有多个选项,有关细节请参考系统手册。为了解本节讨论中所需的信息,我们在基于BSD的系统下执行:
ps -axj
选项-a
显示由其他用户所拥有的进程的状态,-x
显示没有控制终端的进程状态,-j
显示与作业有关的信息:会话ID、进程组ID、控制终端以及终端进程组ID。在基于System V的系统中,与此相类似的命令是ps -efj
(为了提高安全性,某些UNIX系统不允许用户使用ps命令查看不属于自己的进程)。ps的输出大致是:
UID PID PPID PGID SID TTY COMD
root 1 0 1 1 ? /sbin/init
root 2 0 0 0 ? [kthreadd]
root 3 2 0 0 ? [ksoftirqd/0]
root 6 2 0 0 ? [migra-tion/0]
root 7 2 0 0 ? [watch-dog/0]
root 21 2 0 0 ? [cpuset]
root 22 2 0 0 ? [khelper]
root 26 2 0 0 ? [sync_supers]
root 27 2 0 0 ? [bdi-default]
root 29 2 0 0 ? [kblockd]
root 35 2 0 0 ? [kswapd0]
root 49 2 0 0 ? [scsi_eh_0]
root 256 2 0 0 ? [jbd2/sda5-8]
root 26464 1 26464 26464 ? rpcbind -w
root 14596 2 0 0 ? [flush-8:0]
root 13047 2 0 0 ? [kworker/1:0]
root 8196 1 8196 8196 ? /usr/sbin/sshd -D
daemon 1068 1 1068 1068 ? atd
root 1067 1 1067 1067 ? cron
root 1037 1 1037 1037 ? /usr/sbin/inetd
root 906 1 906 906 ? /usr/sbin/cupsd -F
syslog 847 1 843 843 ? rsys-logd -c5
root 257 2 0 0 ? [ext4-dio-unwrit]
statd 28490 1 28490 28490 ? rpc.statd -L
root 28561 1 28561 28561 ? rpc.idmapd
root 28554 2 0 0 ? [nf-siod]
root 28553 2 0 0 ? [rp-ciod]
root 28775 1 28775 28775 ? /usr/sbin/rpc.mountd --manage-gids
root 28764 2 0 0 ? [nfsd]
root 28761 2 0 0 ? [lockd]
其中,已移去了一些我们不感兴趣的列,如累计CPU时间。按照顺序,各列标题的意义分别是用户ID、进程ID、父进程ID、进程组ID、会话ID、终端名称以及命令字符串。
此ps命令在支持会话ID的系统(Linux 3.2.0)上运行,9.5节的setsid函数中曾提及会话ID。简单地说,它就是会话首进程的进程ID。但是,一些基于BSD的系统,如Mac OS X10.6.8,将打印与本进程所属进程组对应的session结构的地址(见9.11节),而非会话ID的地址。
系统进程依赖于操作系统实现。父进程ID 为0 的各进程通常是内核进程,它们作为系统引导装入过程的一部分而启动。(init是个例外,它是一个由内核在引导装入时启动的用户层次的命令。)内核进程是特殊的,通常存在于系统的整个生命期中。它们以超级用户特权运行,无控制终端,无命令行。
在ps
的输出实例中,内核守护进程的名字出现在方括号中。该版本的 Linux使用一个名为kthreadd
的特殊内核进程来创建其他内核进程,所以kthreadd
表现为其他内核进程的父进程。对于需要在进程上下文执行工作但却不被用户层进程上下文调用的每一个内核组件,通常有它自己的内核守护进程。例如,在Linux中:
- kswapd守护进程也称为内存换页守护进程。它支持虚拟内存子系统在经过一段时间后将脏页面慢慢地写回磁盘来回收这些页面。
- flush守护进程在可用内存达到设置的最小阈值时将脏页面冲洗至磁盘。它也定期地将脏页面冲洗回磁盘来减少在系统出现故障时发生的数据丢失。多个冲洗守护进程可以同时存在,每个写回的设备都有一个冲洗守护进程。输出实例中显示出一个名为flush-8:0的冲洗守护进程。从名字中可以看出,写回设备是通过主设备号(8)和副设备号(0)来识别的。
- sync_supers守护进程定期将文件系统元数据冲洗至磁盘。
- jbd守护进程帮助实现了ext4文件系统中的日志功能。
进程1通常是init(Mac OS X中是launchd),8.2节对此做过说明。它是一个系统守护进程,除了其他工作外,主要负责启动各运行层次特定的系统服务。这些服务通常是在它们自己拥有的守护进程的帮助下实现的。实际的控制台上打印这些消息,也可将它们写到一个文件中。(13.4节将对syslog设施进行说明。)
rpcbind守护进程提供将远程过程调用(Remote Procedure Call , RPC)程序号映射为网络端口号的服务.rsyslogd守护进程可以被由管理员启用的系统消息记入日志的任何程序使用.可以在一台实际的控制台上打印这些消息,也可以将它们写到一个文件中.(13.4节将对syslog设施进行说明)
9.3节已谈到inetd守护进程。它侦听系统网络接口,以便取得来自网络的对各种网络服务进程的请求。nfsd、nfsiod、lockd、rpciod、rpc.idmapd、rpc.statd和rpc.mountd守护进程提供对网络文件系统(Network File System,NFS)的支持。注意,前4个是内核守护进程,后3个是用户级守护进程。
cron守护进程在定期安排的日期和时间执行命令。许多系统管理任务是通过cron每隔一段固定的时间就运行相关程序而得以实现的。atd守护进程与cron类似,它允许用户在指定的时间执行任务,但是每个任务它只执行一次,而非在定期安排的时间反复执行。cupsd 守护进程是个打印假脱机进程,它处理对系统提出的各个打印请求。sshd守护进程提供了安全的远程登录和执行设施。
注意,大多数守护进程都以超级用户(root)特权运行。所有的守护进程都没有控制终端,其终端名设置为问号。内核守护进程以无控制终端方式启动。用户层守护进程缺少控制终端可能是守护进程调用了setsid
的结果。大多数用户层守护进程都是进程组的组长进程以及会话的首进程,而且是这些进程组和会话中的唯一进程(rsyslogd 是一个例外)。最后,应当引起注意的是用户层守护进程的父进程是init进程。