1 创建守护进程
1.让init进程成为新产生进程的父进程。
调用fork函数创建子进程后,使父进程立即退出。这样,产生的子进程将变成孤儿进程,并被init进程接管,同时,所产生的新进程将变为在后台运行。
2.调用setsid()
使得新创建的进程脱离控制终端,同时创建新的进程组,并成为该进程组的首进程。
进程组 & 会话 & 控制终端
进程组是一个或多个进程的集合,进程组ID是由领头进程的进程号决定的。
会话是一个或多个进程组的集合,与进程组类似,每个会话都存在一个领头进程。
当用户从终端登录系统,系统会创建一个新的会话。在该终端上启动的进程都会被系统划归到会话的进程组中。
会话中的进程通过该会话中的领头进程与一个终端相连。
由于守护进程不需要控制终端,因此,必须创建新的会话,以脱离父进程的影响,Linux系统提供了setsid函数用于创建新的会话,并使得调用setsid函数的进程成为新会话的领头进程。
setsid()调用成功后,进程成为新的会话组长和新的进程组长,并与原来的登录会话和进程组脱离。
此时进程没有控制终端,但要防止其以后打开控制终端,可以通过使进程不再成为会话组长来禁止进程重新打开控制终端:
if(pid=fork())
exit(0);
3.更改当前工作目录
使用fork函数产生的子进程将继承父进程的当前工作目录。当进程没有结束时,其工作目录是不能被卸载的。为了防止这种问题发生,守护进程一般会将其工作目录更改到根目录下(/目录)。更改工作目录使用的函数是chdir。
4.关闭文件描述符,并重定向标准输入、输出和错误输出
新产生的进程从父进程继承了某些打开的文件描述符,如果不使用这些文件描述符,则需要关闭它们。守护进程是运行在系统后台的,不应该在终端有任何的输出信息。可以使用dup函数将标准输入、输出和错误输出重定向到/dev/null设备上(/dev/null是一个空设备,向其写入数据不会有任何输出)。
5.设置守护进程的文件权限创建掩码
很多情况下,守护进程会创建一些临时文件。出于安全性的考虑,往往不希望这些文件被别的用户查看。这时,可以使用umask函数修改文件权限,创建掩码的取值,以满足守护进程的要求。
简单实现
void init_daemon(void)
{
int pid;
int i;
if(pid=fork())
exit(0); //结束父进程
else if(pid< 0)
exit(1);
//第一子进程,后台继续执行
setsid(); //第一子进程成为新的会话组长和进程组长,并与控制终端分离
if(pid=fork())
exit(0); //结束第一子进程
else if(pid< 0)
exit(1); //
//第二子进程继续执行,第二子进程不再是会话组长
for(i=0;i< NOFILE;++i) //关闭打开的文件描述符
close(i);
chdir("/tmp"); //改变工作目录到/tmp
umask(0); //重设文件创建掩模
return;
}
超级守护进程Xinetd
xinetd能够同时监听多个指定的端口,在接受用户请求时,它能够根据用户请求的端口的不同,启动不同的网络服务进程来处理这些用户请求。
xinetd和stand-alone工作模式相比,运行单个xinetd就可以同时监听所有服务端口,这样就降低了系统开销。
但是对于访问量大、经常出现并发访问的情况,xinetd则要频繁启动相应的网络服务进程,反而会导致系统性能下降。
pstree命令能看到两种不同模式启动的网络服务。一般来说系统中一些负载高的服务,Sendmail、Apache服务是单独启动的;而其他服务类型都可以使用xinetd超级服务器管理。
2 守护进程的日志管理
由于守护进程并不拥有控制终端,因此无法将进程运行信息输出显示。但有时候需要根据进程提供的信息来进行系统管理和维护工作。为此,Linux系统提供了一种特殊的机制来解决守护进程的日志问题。syslogd守护进程通过接收其他守护进程的信息,并将这些信息记录在指定位置来解决日志记录问题。syslogd守护进程会根据消息级别来判断是将消息记录在日志文件,还是显示在用户终端上。
Linux日志管理:
内核信息 -> klogd -> syslogd -> /var/log/dmesg
其他信息 -> syslogd -> /var/log/messages等文件
syslog配置文件 -> /etc/syslog.conf
Syslog原理
syslog负责发送、记录系统内核及工具所产生的信息,由syslog()调用、syslogd守护进程和配置文件/etc/syslog.conf组成。当系统内核及工具产生信息时,通过调用syslog(),把信息送往syslogd,syslogd再根据/etc/syslog.conf中的配置要求,将这些信息分别作如下处理:
1记录到系统日志中
2输出到系统控制台上
3转发给指定的用户
4通过网络转发给其他主机上的syslogd