全部博文(842)
分类: 系统运维
2012-05-13 21:36:28
让我们看看一个普遍的系统守护进程和它们如何和进程组、控制终端、和会话(第9章)的概念关联,ps命令打印系统的各种进程的状态。有许多选项-- 参考你系统手册。我们将执行ps -axj,在基于BSD的系统下来看我们讨论所需的信息。-a选项显示被其它人拥有的进程,而-x显示没有控制终端的进程。-j选项显示工作相关的信息: 会话ID,进程组ID,控制终端,和终端进程组ID。在基于系统V的系统下,类似的命令是ps -efjc。(为了提升安全性,一些UNIX系统不允许我们使用ps来看不属于我们的任何进程。)ps的输出如:
PPID PID PGID SID TTY TPGID STAT UID TIME COMMAND
0 1 1 1 ? -1 Ss 0 0:00 /sbin/init
0 2 0 0 ? -1 S 0 0:00 [kthreadd]
2 3 0 0 ? -1 S 0 0:00 [ksoftirqd/0]
2 6 0 0 ? -1 S 0 0:00 [migration/0]
2 7 0 0 ? -1 S 0 0:00 [migration/1]
2 9 0 0 ? -1 S 0 0:00 [ksoftirqd/1]
2 11 0 0 ? -1 S< 0 0:00 [cpuset]
2 12 0 0 ? -1 S< 0 0:00 [khelper]
2 13 0 0 ? -1 S< 0 0:00 [netns]
2 15 0 0 ? -1 S 0 0:00 [sync_supers]
我们感兴趣的列为父进程ID、进程ID、进程组ID、会话ID,终端名终端组ID(与控制终端相关的前台进程组),用户ID,和命令字符串。
运行这个ps命令的系统(Linux)支持一个会话ID的符号,我们在9.5节和setsid函数一起提到过。会话ID只是简单地为会话领导的进程ID。然而,基于BSD的系统将会打印session结构体的地址对应于这个进程所属的进程组(9.11节)。
你 看到的系统进程将取决于操作系统实现。任何父进程ID为0的进程通常是一个内核进程,作为系统启动过程的一部分。(一个例外是init,它是在系统启动时 由内核启动的用户级命令。)内核进程是特殊的,通常存在于系统的整个生命周期。它们以超级用户权限运行,并没有控制终端也没有命令行。
进程1通常是init,如我们在8.2节描述的。它是一个守护进程,负责在其它东西之间启动特定运行等级的系统服务。这些服务通常在它们自己的守护进程的帮助下实现。
在 Linux上,keventd守护进程为运行内核里的调度的函数提供进程上下文。kapmd守护进程提供了高级的电源管理特性的支持,在各种计算机系统上 可用。kswapd守护进程也被称为页出(page out)守护进程。它通过不时地缓慢地把脏页写到磁盘里来支持虚拟内存子系统,所以页可以被回收。
Linux内核使用两个额外的守护进程来把缓存的数据冲洗到磁盘:bdflush和kupdated。bdflush守护进程把脏缓冲从缓冲缓存冲洗回磁盘,当可用内存到达一个低水位标记。kupdated守护进程在定期把脏页冲洗回磁盘来减少系统失败事件的数据丢失。
端 口映射守护进程,portmap,提供了把RPC(Remote Procedure Call,远程过程调用)程序号映射到网络端口号。syslogd守护进程对任意程序可用,为一个操作记录系统消息。消息可能被打印到一个控制台设备或写 到一个文件。(syslog,13.4节)
我们9.3节说过inet守护进程。它监听系统的网络接口,等待对各种网络服务器的请求。nfsd、lockd、和rpciod守护进程提供了Network File System(NFS)的支持。
cron守护进程(crond)在指定的日期和时间执行命令。许多系统管理任务被cron定期执行的程序处理。cupsd守护进程是一个打印假脱机程序(sppler);它处理系统上的打印请求。
注 意多数守护进程用超级用户权限运行(用户ID为0)。没有一个守护进程有控制终端:终端名被设为一个问号,以及终端前台进程组为-1。内核守护进程不带控 制终端被启动。用户级守护进程的控制终端的缺失,很可能是守护进程调用了setsid的结果。所有用户组守护进程都是进程组长和会话领导,也是它们进程组 和会话里的唯一进程。最后,注意这些守护进程里多数的父进程是init进程。