第十三章 守护进程 daemon process
13.1 引言
这是生存周期长的一种进程,没有控制终端,在后台运行。、
多用来处理日常事务活动
13.2 守护进程的特征
ps 命令打印系统中各个进程的状态
13.3 编程规则
在编写守护进程程序时需要遵循一些基本规则,以防止产生不必要的交互作用:
- 首先调用
umask将文件模式创建屏蔽字设置为一个已知值(通常是0) - 调用
fork,然后使父进程exit。这样做的目的有两个:1. 如果此进程以一条 shell 命令启动,这样做会让 shell 认为此条命令已经执行完毕; 2. 子进程虽然继承了父进程的进程组ID,但是它有一个新的进程ID,这就保证了子进程不是一个进程组的组长进程,这是调用setsid的先决条件 调用
setsid创建一个新会话。由于子进程不是进程组组长进程,根据9.5节交代的,具体会发生三件事- 该子进程变成新会话的领导,此时此刻,该进程是会话中的唯一进程
- 该子进程成为一个新进程组的组长,进程组ID就是该子进程的进程ID
- 该进程没有控制终端
将当前工作目录更改为根目录
- 关闭不再需要的文件描述符
13.4 出错记录
广泛使用的出错记录设施是 syslog ,它的组织结构如下图所示
- 内核可以调用
log函数向 /dev/klog 写入记录 - 通过 UDP 协议发送到 514 端口
- 大多数用户进程调用
syslog函数 将记录写入 /dev/log
syslogd 守护进程读取以上3种日志消息。此进程在启动的时候读取一个配置文件,通常名为 /etc/syslog.conf ,该文件决定了不同种类的消息应该送往何处
1 |
|
openlog 的 option 参数指定各种选项的位屏蔽,它有以下选项:
openlog 的 facility 参数可以说明来自不同设施的消息将以不同的方式处理,它的可选值如下
syslog 的 priority 参数是 facility 和 level 的组合
format 参数以及其他所有参数传至 vsprintf 函数以便进行格式化。format 参数中的每个 %m 字符 会被替换成 errno 值对应的字符串
setlogmask 函数设置进程的记录优先级
13.5 单例守护进程 single-instance daemons
单例 指的是在任何时刻只运行一个实例
对文件使用记录锁为单例守护进程的实现提供了一种简便的方法
13.6 守护进程的惯例
- 若守护进程使用锁文件,那么该文件通常存储在 /var/run 目录中并命名为 name.pid 。其中 name 是守护进程或服务的名字。例如
cron守护进程锁文件的名字 /var/run/crond.pid - 如果守护进程支持配置选项,那么配置文件通常存放在 /etc 目录中,通常命名为 name.conf 。其中 name 是守护进程或者服务的名字。例如
syslogd的配置文件名字 /etc/syslog.conf - 守护进程可以用命令行启动,但它们通常是由系统初始化脚本启动的
- 如果一个守护进程有一个配置文件,那么当该守护进程启动时就会读取该文件,但在此之后一般就不会再查看它。
13.7 客户-服务器进程模型
守护进程通常作为服务器进程。