守护进程Xinted和日志记录Syslogd


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

几乎所有的网络设备都可以通过syslog协议,将日志信息以用户数据报协议(UDP)方式传送到远端服务器,远端接收日志服务器必须通过syslogd监听UDP端口514,并根据 syslog.conf配置文件中的配置处理本机,接收访问系统的日志信息,把指定的事件写入特定文件中,供后台数据库管理和响应之用。意味着可以让任何事件都登录到一台或多台服务器上,以备后台数据库用off-line(离线) 方法分析远端设备的事件。

Syslog.conf配置格式为

服务名[.=!]记录等级  记录文件或主机

日志安全性

设置隐藏属性 chattr +a /var/log/messages,只允许append不可delete

--------------------------------------分割线 --------------------------------------

RHEL5.4部署中央日志服务器之rsyslog+Log Analyzer

CentOS 6.3下利用Rsyslog+LogAnalyzer+MySQL部署日志服务器

使用rsyslog mysql 和logAnalyzer 的日志服务器

CentOS 6.3下利用Rsyslog+LogAnalyzer+MySQL部署日志服务器

RHEL5.4部署中央日志服务器之rsyslog+loganalyzer 

--------------------------------------分割线 --------------------------------------

本文永久更新链接地址:

相关内容