守护进程

概念

    守护进程,也就是通常说的Daemon进程,是Linux中的后台服务进程。它是一个生存期较长的进程,通常独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件。守护进程常常在系统引导装入时启动,在系统关闭时终止。Linux系统中大多数服务和系统任务都是通过守护进程实现的。例如,作业规划进程crond、打印进程lqd、nfsd、lockd、rpciod(这三个是NFS的守护进程)、portmap(端口映射守护进程提供将RPC程序号映射为port好的服务)、bdflush(当内存达到下限时,将buffer cache flush到磁盘上)、kupdated(每隔一段时间,kupdated将dirty page flush到磁盘上以免数据丢失)、syslogd(由帮助操作人员把系统消息记入日志的任何程序使用)、crond(指定的日期和时间执行命令)。
 
 
创建守护进程
(1).创建子进程,父进程退出,这样让init收养子进程。
(2).调用setsid子进程中创建新会话
  会话周期:会话期是一个或多个进程组的集合。通常,一个会话开始与用户登录,终止于用户退出,在此期间该用户运行的所有进程都属于这个会话期。
  setsid函数用于创建一个新的会话,并担任该会话组的组长。调用setsid有下面的3个作用:
  让进程摆脱原会话的控制
  让进程摆脱原进程组的控制
  让进程摆脱原控制终端的控制
  子进程全盘继承了了父进程的会话期、进程组、控制终端等,虽然父进程退出了,但会话期、进程组、控制终端等并没有改变,因此,还还不是真正意义上的独立开来,而setsid函数能够使进程完全独立出来,从而摆脱控制终端和其他进程的控制。
(3).改变当前目录(一般为根目录)
  这一步也是必要的步骤。使用fork创建的子进程继承了父进程的当前工作目录。由于在进程运行中,当前目录所在的文件系统(如“/mnt/usb”)是不能卸载的,这对以后的使用会造成诸多的麻烦(比如系统由于某种原因要进入单用户模式)。因此,通常的做法是让"/"作为守护进程的当前工作目录,这样就可以避免上述的问题,当然,如有特殊需要,也可以把当前工作目录换成其他的路径,如/tmp。改变工作目录的常见函数式chdir。
(4).重设文件权限掩码umask(0)。
(5).关闭文件描述符
  同文件权限码一样,用fork函数新建的子进程会从父进程那里继承一些已经打开了的文件。这些被打开的文件可能永远不会被守护进程读写,但它们一样消耗系统资源,而且可能导致所在的文件系统无法卸下。
  在上面的第二步之后,守护进程已经与所属的控制终端失去了联系。因此从终端输入的字符不可能达到守护进程,守护进程中用常规方法(如printf)输出的字符也不可能在终端上显示出来。所以,文件描述符为0、1和2 的3个文件(常说的输入、输出和报错)已经失去了存在的价值,也应被关闭。通常按如下方式关闭文件描述符:
for(i=0;i<MAXFILE;i++)
close(i);
其他一些惯例:
(1).要保证守护进程运行唯一副本,一般使用文件锁或记录锁。锁文件放在/var/run/deamon_name.pid
(2).锁的选项文件通常放在/etc目录中,配置文件是deamon_name.conf
(3).守护进程可以由命令行启动。通常他们是由初始化脚本之一/etc/init.d/*启动。如果守护进程终止时应该自动重新启动,可以在inittab为该守护进程设置respawn记录项。这样init就会自动启动该守护进程。
(4).由于守护进程不与终端关联,它们是无控制终端的会话首进程或者孤儿进程组成员,所以SIGHUP信号可以用于其他用途,比如当管理员更改了配置文件,守护进程不需要重启动将读重新应用配置文件的操作设置为SIGHUP信号处理程序。(一般更新配置文件后运行一个update-config程序来发送信号给守护进程)。
 
日志消息
有三种方法产生日志消息:
(1).内核调用log函数,任何一个用户通过open&read /dev/klog设备就可以读这些消息。
(2).大多数用户进程(守护进程)调用syslog函数产生日志消息,这使消息发送到UNIX域数据报嵌套字/dev/log。
(3).在此主机上的一个用户进程或通过TCP/IP网络链接到此主机的其他主机上的用户进程可将日志消息发送到UDP514端口。
#include <syslog.h>
void openlog(const char *ident, int option, int facility);
void syslog(int priority, const char *format, ...);
void closelog(void);
int setlogmask(int maskpri);
ident一般是程序名称(cron, inetd等),例如在一个打印机加假脱机守护进程中,可能包含下面的调用序列:
open("lpd", LOG_PID, LOG_LPR); /*LOG_PID表示每条消息包含lpd守护进程的pid, LOG_LPR为行打印*/
syslog(LOG_ERR,“error in opening file:%s:%m”, filename) /*LOG_ERR是守护进程的priority*/
 
保证一个时间运行一个守护进程的副本:使用文件锁或记录锁
#define LOCKFILE "/var/run/deamon.pid" /*惯例来说锁文件放在这个目录下,文件名name.pid*/
#define LOCKMODE (S_IRUSR|S_IWUSR|S_IRGRP|S_IROTH)
fd=open(LOCKFILE, O_RDWR|O_CREAT, LOCKMODE);
if (lockfile(fd) != 0) {
if(errno == EACCES || errno == EAGAIN) {
/*守护进程正在运行*/
close(fd);
return(1);
}
syslog(...); /*其他错误*/
exit(1);
}
ftruncate(fd,0);
sprintf(buf, "%ld", (long)getpid());
write...
return(0);
 
chkconfig
chkconfig命令也可以用来激活和解除服务。chkconfig--list命令显示系统服务列表,以及这些服务在运行级别0到6中已被启动(on)还是停止(off)。chkconfig还能用来设置某一服务在某一指定的运行级别内被启动还是被停运。例如,要在运行级别3、4、5中停运nfs服务,使用下面的命令:
chkconfig --level 345 nfs off
 
 
网络编程中C/S守护进程模型
    在C/S模式下,服务器监听(Listen)在一个特定的端口上等待客户连接。连接成功后服务器和客户端通过端口进行数据通信。守护进程的工作就是打开一个端口,并且等待(Listen)进入连接。如果客户端产生一个连接请求,守护进程就创建(Fork)一个子服务器响应这个连接,而主服务器继续监听其他的服务请求。
独立运行的守护进程由init脚本负责管理,所有独立运行的守护进程的脚本在/etc/rc.d/init.d/目录下。系统服务都是独立运行的守护进程包括:syslogd和cron等。运行独立的守护进程工作方式称为stand-alone。它UNIX传统的C/S模式的访问模式。服务器监听在一个特点的端口上等待客户端的连接。如果客户端产生一个连接请求,守护进程就创建一个子服务器响应这个连接,而主服务器继续监听。以保持多个子服务器池等待下一个客户端请求。
    工作在stand-alone模式下的网络服务有route、gated。另外是大家最熟悉是Web服务器:Apache和邮件服务器Sendmail、域名服务器Bind。因为这些负载很大服务器上,预先创子服务器,可以通过客户的服务速度。在Linux系统中通过stand-alone工作模式启动的服务由/etc/rc.d/下面对应的运行级别当中的符号链接启动。
    从守护进程的概念可以看出,对于系统所要通过的每一种服务,都必须运行一个监听某个端口连接所发生的守护进程,这通常意味着资源浪费。为了解决这个问题,Linux引进了"网络守护进程服务程序"的概念。Redhat Linux 9以后版本使用的网络守护进程是xinetd(eXtended InterNET daemon)。和stand-alone模式相比,xinted模式也称Internet Super-Server(超级服务器)。xinetd能够同时监听多个指定的端口,在接受用户请求时,它能够根据用户请求的端口不同,启动不同的网络服务进程来处理这些用户请求。可以把xinetd看做一个管理启动服务的管理服务器,它决定把一个客户请求交给那个程序处理,然后启动相应的守护进程。
    和stand-alone工作模式相比,系统不想要每一个网络服务进程都监听其服务端口。运行单个xinetd就可以同时监听所有服务端口,这样就降低了系统开销,保护了系统资源。但是当访问量大、经常出现并发访问时,xinetd想要频繁启动对应的网络服务进程,反而会导致系统性能下降。查看系统为Linux服务提供哪种模式方法在Linux命令行可以使用pstree命令,可以看到两种不同方式启动的网络服务。一般来说一些负载高的服务如sendmail、Apache服务是单独启动的。而其他服务类型都可以使用xinetd超级服务器管理。
 
Reference
APUE
baike.baidu.com
http://www.unlinux.com/doc/net/20051028/5950.html

你可能感兴趣的:(职场,进程,守护进程,休闲)