守护进程(daemon)是生存期长的一种进程,常常在系统引导装入时启动,仅在系统关闭时终止,因为它们没有控制终端,unix有很多守护进程,它们执行日常事务活动。
守护进程的特征:
执行指令:ps -zxj //a显示其他用户拥有的进程状态,-x显示没有终端控制的进程状态,-j显示与作业有关的信息:会话ID、进程组ID等。
内核守护进程的名字出现在方括号内,ubuntu使用名为kthreadd的特殊内核来创建其他内核进程,对于需要在进程上下文执行工作但却不被用户层进程上下文调用的每一个内核组件,通常有它自己的内核守护进程,比如:
kswapd守护进程也称为内存换页守护进程。
flush守护进程在可用内存达到设置的最小阈值时将脏页面冲洗至磁盘。
进程1通常是init,这是一个系统守护进程。
注意大多数守护进程都是以root身份运行的,所有的守护进程都没有控制终端,其终端名设置为问号。
编程规则:
在编写守护进程程序时要遵循一些基本规则
1.首先要调用umask将文件模式创建屏蔽字设置为一个已知值(0).由继承得来的文件模式创建屏蔽字可能会被设置为拒绝某些权限。如果守护进程要创建文件,那么它可能要设置特定的权限。
2.调用fork,然后使父进程exit。
3.调用setsid创建一个新会话。然后使调用进程:1.成为新会话的首进程,2.成为一个新进程组的组长进程。3.没有控制终端
4.将当前工作目录更改为根目录,从父进程继承过来的当前工作目录可能挂载在文件系统中,因为守护进程通常在在系统再引导前是一直存在的,所以如果守护进程的当前工作目录在一个挂载文件系统中,那么该文件系统就不能被卸载
5.关闭不再需要的文件描述符。
6.某些守护进程打开/dev/null使其具有文件描述符0、1和2,这样任何一个试图读标准输入、写标准输出的库例程都不会产生任何效果。
出错记录:
守护进程存在的一个问题是如何处理出错消息,因为它本来就不应该有控制终端。自4.2BSD以来,BSD的syslog设施得到了广泛的应用。大多数守护进程都使用这一设施。
有三种可以产生日志消息的方法:
1.内核例程可以调用log函数
2.大多数用户进程(守护进程)调用syslog函数来产生日志消息,我们将在下面说明其调用序列。
3.无论一个用户进程是在此主机上,还是通过TCP/IP网络连接到此主机的其他主机上,都可将日志消息发向UDP端口514.。
通常syslogd守护进程读取所有三种格式的日志信息,此守护进程在启动时读一个配置文件,其文件名一般为/etc/syslog.conf。该文件决定了不同种类的消息应送向何处。
该设施的接口是syslog函数
调用openlog是可选择的,如果不调用openlog,则在第一次调用syslog时,自动调用openlog,调用closelog也是可选择的,因为它只是关闭曾被用于与syslogd守护进程进行通信的描述符。
openlog的option参数
openlog的facility参数选自下图:
调用syslog产生一个日志消息,其priority参数是facility和level的组合,它们选择的值分别来自上图的facility和下图的level
守护进程的惯例:
1.若守护进程使用锁文件,那么该文件通常存储在/var/run目录中,需要注意的是守护进程可能需要超级用户权限才能在此目录下创建文件,锁文件的名字通常是name.pid,其中name是该守护进程的名字
2.若守护进程支持配置选项,那么配置文件通常存放在/etc目录中,文件名通常是name.conf
3.守护进程可用命令行启动,但通常它们是系统初始化脚本之一启动的。
4.若一个守护进程有一个配置文件,那么当守护进程启动时会读该文件,但是在此之后一般就不会再查看它。如果管理员修改了配置文件,那么该守护进程可能需要被停止,然后重新启动使得配置文件 生效,为了避免这种麻烦,守护进程将捕捉SIGHUP信号,当它们接受到该信号时,重新读取配置文件。