37.1 概述
daemon是一种具备以下特征的进程:
- 它的生命周期很长。通常,一个daemon会在系统启动的时候被创建并一直运行至系统被关闭.
- 它在后台运行并且不拥有控制终端。控制终端的确实确保了内核永远不会为daemon自动生成任何任务控制信号以及终端相关的信号。
daemon是用来执行特殊任务的,如下面的示例所示。
cron:一个在规定时间执行命令的daemon.
sshd:安全shell daemon,允许在远程主机上使用一个安全的通信协议登陆系统。
httpd:HTTP服务器daemon,它用于服务web页面。
inetd:internet超级服务器daemon,它监听从指定的TCP/IP端口上进入的网络连接并启动相应的服务器程序来处理这些连接。
37.2 创建一个daemon
becomeDaemon()函数将调用者变成一个daemon.
flags:位掩码参数,它允许调用者有选择地执行其中的步骤:
37.3 编写daemon指南
由于daemon是长时间运行的,因此要特别小心潜在的内存泄漏问题和文件描述符泄露。如果此类bug影响到了daemon的运行,那么唯一的解决方案是杀死他,之后再重新启动它。
37.4 使用SIGHUP重新初始化一个daemon
由于很多daemon需要持续运行,因此在设计daemon程序时需要克服一些障碍。
解决方案:
让daemon为SIGHUP建立一个处理器。由于daemon没有控制终端,所以内核永远不会向daemon发送这个信号。
因此可以通过该信号来通知daemon进程进行一些操作。
37.5 使用syslog记录消息和错误
概述:
syslog工具提供了一个集中式日志工具,系统中的所有应用程序都可以使用这个工具来记录日志消息。
syslog API
建立一个到系统日志的连接:
ident: 字符串指针,通常是程序名,syslog()输出的每条消息都会包含这个字符串。
log_options: 位掩码,是下面几个常量的OR值。
facility:
记录一条日志消息:
priority:是facility和level的OR值。
关闭日志:
过滤日志消息:
该函数设置了一个能过滤由syslog()写入的消息的掩码。 使用方法:
或者
//etc/syslog.conf 文件
该配置文件控制syslogd daemon的操作。
示例:
每次修改syslog.conf文件之后都需要使用下面的方式让daemon根据这个文件重新初始化自身。
$ killall -HUP syslogd