守护进程


守护进程

文章插图
守护进程【守护进程】守护进程(daemon)是一类在后台运行的特殊进程,用于执行特定的系统任务 。很多守护进程在系统引导的时候启动,并且一直运行直到系统关闭 。另一些只在需要的时候才启动,完成任务后就自动结束 。
基本介绍中文名:守护进程
外文名:Daemon
简介守护进程是一个在后台运行并且不受任何终端控制的进程 。Unix作业系统有很多典型的守护进程(其数目根据需要或20—50不等),它们在后台运行,执行不同的管理任务 。用户使守护进程独立于所有终端是因为,在守护进程从一个终端启动的情况下,这同一个终端可能被其他的用户使用 。例如,用户从一个终端启动守护进程后退出,然后另外一个人也登录到这个终端 。用户不希望后者在使用该终端的过程中,接收到守护进程的任何错误信息 。同样,由终端键入的任何信号(例如中断信号)也不应该影响先前在该终端启动的任何守护进程的运行 。虽然让伺服器后台运行很容易(只要shell命令行以&结尾即可),但用户还应该做些工作,让程式本身能够自动进入后台,且不依赖于任何终端 。守护进程没有控制终端,因此当某些情况发生时,不管是一般的报告性信息,还是需由管理员处理的紧急信息,都需要以某种方式输出 。Syslog 函式就是输出这些信息的标準方法,它把信息传送给 syslogd 守护进程 。创建步骤(1)创建子进程,终止父进程由于守护进程是脱离控制终端的,因此首先创建子进程,终止父进程,使得程式在shell终端里造成一个已经运行完毕的假象 。之后所有的工作都在子进程中完成,而用户在shell终端里则可以执行其他的命令,从而使得程式以殭尸进程形式运行,在形式上做到了与控制终端的脱离 。(2)在子进程中创建新会话这个步骤是创建守护进程中最重要的一步,在这里使用的是系统函式setsid 。setsid函式用于创建一个新的会话,并担任该会话组的组长 。调用setsid仃三个作用:让进程摆脱原会话的控制、让进程摆脱原进程组的控制和让进程摆脱原控制终端的控制 。在调用fork函式时,子进程全盘拷贝父进程的会话期(session,是一个或多个进程组的集合)、进程组、控制终端等,虽然父进程退出了,但原先的会话期、进程组、控制终端等并没有改变,因此,那还不是真正意义上使两者独立开来 。setsid函式能够使进程完全独立出来,从而脱离所有其他进程的控制 。(3)改变工作目录使用fork创建的子进程也继承了父进程的当前工作目录 。由于在进程运行过程中,当前目录所在的档案系统不能卸载,因此,把当前工作目录换成其他的路径,如“/”或“/tmp”等 。改变工作目录的常见函式是chdir 。(4)重设档案创建掩码档案创建掩码是指禁止掉档案创建时的对应位 。由于使用fork函式新建的子进程继承了父进程的档案创建掩码,这就给该子进程使用档案带来了诸多的麻烦 。因此,把档案创建掩码设定为0,可以大大增强该守护进程的灵活性 。设定档案创建掩码的函式是umask,通常的使用方法为umask(0) 。(5)关闭档案描述符用fork新建的子进程会从父进程那里继承一些已经打开了的档案 。这些被打开的档案可能永远不会被守护进程读或写,但它们一样消耗系统资源,可能导致所在的档案系统无法卸载 。运行方式①独立运行的守护进程独立运行的守护进程由 init 脚本负责管理,所有独立运行的守护进程的脚本在/etc/rc.d/init.d/目录下 。系统服务都是独立运行的守护进程包括 syslogd 和 cron 等 。伺服器监听在一个特点的连线埠上等待客户端的连线 。如果客户端产生一个连线请求,守护进程就创建一个子伺服器回响这个连线,而主伺服器继续监听 。以保持多个子伺服器池等待下一个客户端请求 。②由 xinetd 管理的守护进程从守护进程的概念可以看出,系统所运行的每一种服务,都必须运行一个监听某个连线埠连线所发生的守护进程,这通常意味着资源浪费 。为了解决这个问题,Linux引进了“网路守护进程服务程式”的概念 。CentOS 6.4使用的网路守护进程是xinted(eXtendedInterNET services daemon) 。xinetd能够同时监听多个指定的连线埠,在接受用户请求时,它能够根据用户请求的连线埠不同,启动不同的网路服务进程来处理这些用户请求 。可以把xinetd看作一个管理启动服务的管理伺服器,它决定把一个客户请求交给那个程式处理,然后启动相应的守护程式 。特点首先,守护进程最重要的特性是后台运行 。其次,守护进程必须与其运行前的环境隔离开来 。这些环境包括未关闭的档案描述符、控制终端、会话和进程组、工作目录以及档案创建掩码等 。这些环境通常是守护进程从执行它的父进程(特别是shell)继承下来的 。最后,守护进程的启动方式有其特殊之处 。它可以在Linux系统启动时从启动脚本/etc/rc.d中启动,也可以由作业控制进程crond启动,还可以由用户终端(通常是shell)执行 。除r这止电以外,守护进程与普通进程基本上没有什幺区别 。因此,编写守护进样实际上是把一个普通进程按照上述的守护进程的特性改造成为守护进程 。分类按照服务类型分为如下几个 。