本站总访问量 Unix环境高级编程-守护线程 - Jerry的小站

Jerry Gao

上帝就是真理,真理就是上帝

概念

是生存期长的一种进程,常常在系统引导装入时启动,仅在系统关闭时终止,没有控制终端,所以在后台运行

守护进程的特征

系统进程依赖于操作系统实现,父进程ID为0的各进程通常是内核进程,作为系统装入过程的一部分而启动(init进程是个例外,由内核在引导装入时启动用户层次的命令)内核进程是特殊的,通常存在于系统的整个生命周期中,一超级用户权限运行,无控制终端,无命令行。

Linux使用一个名为kthreadd的内核进程来创建其他的内核进程,所以kthreadd为其他内核进程的父进程。对于需要在内核上下文执行工作但却不被用户层上下文调用的每一个内核组件,通常有自己的内核守护进程。

  • kswapd守护进程也叫内核换页守护进程。支持虚拟内存子系统在经过一段时间后将脏页面慢慢写回磁盘来回收这些页面。
  • flush守护进程在可用内存达到设置的最小阈值时将脏页面冲洗至磁盘。也定期将脏页面冲洗回磁盘来减少在系统出现故障时发生的数据丢失。多个冲洗守护进程可以同时存在,每个写回的设备都有一个冲洗守护进程。
  • sync_supers守护进程定期将文件系统元数据冲洗至磁盘
  • jbd守护进程帮助实现了ext4文件系统中的日志功能
  • rpcbind守护进程提供将远程调用(RPC)程序号映射为网络端口号的服务。rsyslogd守护进程将系统消息记入日志的任何程序使用
  • inetd守护进程侦听网络系统接口,以取得来自网络的对各种网络服务进程的请求
  • cron守护进程在定期安排的日期和时间执行命令

大多数进程都以超级用户权限运行,所有的守护进程都没有控制终端,其控制终端设置为问号,内核守护进程以无控制终端方式启动。用户级守护进程是调用了setsid。用户级守护进程的父进程是init进程。

守护进程如何让处理出错记录

需要有一个集中的守护进程出错记录设施

syslog设施得到了广泛的应用,大多数守护进程都是使用这一设施,有以下3种产生日志消息的方法:

  • 内核例程调用log函数。任何一个进程都可以打开并读取/dev/klog设备来读取这些消息。大多数用户守护进程调用syslog函数来产生日志消息,这些消息被发送至/dev/log
  • 无论一个用户进程是在此主机上,还是在通过TCP/IP网络连接到其他主机上,都可以将日志消息发向UDP端口514。

通常syslogd守护进程读取所有3种格式的日志消息。此守护进程在启动时读一个配置文件,文件名一般为/etc/syslog.conf,决定了不同种类的消息应送向何处

单实例守护进程

为了正常运作,某些进程可能会实现为,在任意时刻只运行该守护进程的一个副本。(对于cron进程来说,如果有多个实例运行,那么每个副本都可能试图开始某个预定的操作,于是造成该操作的重复执行,可能导致出错)文件和记录锁机制为一种方法提供了基础,该方法保证一个守护进程只有一个副本在运行。如果每一个守护进程创建一个有固定名字的文件,并在该文件的整体上加一把写锁,那么只允许创建一把这样的写锁,在此之后创建的写锁的尝试都会失败。

文件和记录锁提供了一种方便的互斥机制,如果守护基础在一个文件的整体上得到一把写锁,那么在该守护进程终止时,这把锁将被自动删除。简化了复原所需的处理,去除了对以前的守护进程实例需要进程清理的有关操作。

守护进程的惯例

  • 若使用锁文件,那么该文件通常储存在/var/run目录下。
  • 若守护进程支持配置选项,那么该配置通常存放在/etc目录下
  • 守护进程可用命令行启动,但他们通常是由系统初始化脚本之一(/etc/rc*或者是/etc/init.d/*)启动的
  • 若一个守护进程有一个配置文件,那么当该守护进程启动时会读取该文件,在此之后一般不会再查看它。当某个管理员更改了配置文件,那么该守护进程可能需要被停止,然后再启动,以使该配置文件更改生效。为避免麻烦,有些守护进程通常将捕捉SIGHUP信号,当他们接收到该信号时,重新读配置文件。

客户进程-服务器进程模型

在服务进程中调用fork然后exec另一个程序来向客户进程提供服务是很常见的,这些服务进程通常管理着多个文件描述符:通信端点、配置文件、日志文件和类似文件。通常情况下,让子进程中的这些文件描述符保持打开状态并无大碍,他们可能不会被在子进程中执行的程序中所使用,尤其是那些与服务器端无关的程序最坏情况下,保持打开状态会导致安全问题,如更改服务器端或欺骗客户端程序使其认为正在与服务器端通信,从而获取未授权的信息。

解决此问题的一个方法是对所有被执行程序不需要的文件描述符执行时关闭close-on-exec标志。

评论