现在的位置: 首页 > 综合 > 正文

第12章 守护进程和inetd超级服务器

2013年05月06日 ⁄ 综合 ⁄ 共 2760字 ⁄ 字号 评论关闭

1.        守护进程是在后台运行,不受终端控制的进程。守护进程即使在某个终端上运行起来的,在进入到守护状态之后,就不会受到这个终端的控制了,在终端上产生的终端信号,不会对以前在这个终端启动的守护进程产生作用(比如说中断信号ctrl+c)

2.        守护进程启动方式:

在系统启动的时候很多守护进程都是由系统初始化脚本启动的。

许多网络服务器是由inetd超级服务器启动的,inet是在系统初始化脚本启动的

cron定期会执行一些程序,cron守护进程的启动方式也是脚本

at命令定时启动

还有就是在终端控制启动。

3          守护进程是没有控制终端的,打印的日志信息都会发送给syslog守护进程

syslog守护进程

syslog设备依据两个重要的文件:/etc/syslogd守护进程和/etc/syslog.conf配置文件。通常情况下,多数syslog信息被写到/var/adm或/var/log目录下的信息文件中(messages.*)。一个典型的syslog记录包括生成程序的名字和一个文本信息。它还包括一个设备和一个优先级范围。

 syslog.conf行的基本语法是:

  消息类型.优先级 动作域

星号(*)的含义是把本项服务生成的所有日志消息都发送到操作动作指定的地点。就像它在规则表达式里的作用一样,星号代表“任何东西”。在前面给出的例子里,“mail.*”将把所有优先级的消息都发送到操作动作指定的/var/log/mail文件里。使用“*”限定符与使用“debug”优先级的效果完全一样,后者也将把所有类型的消息发送到指定地点。

  等号(=)的含义是只把本项服务生成的本优先级的日志消息都发送到操作动作指定的地点。比如说,可以用“=”限定符只发送调试消息而不发送其他更紧急的消息(这将为应用程序减轻很多负担)。当你只需要发送特定优先级别的消息时,就要使用等号限定符。

  叹号(!)的含义是把本项服务生成的所有日志消息都发送到操作动作指定的地点,但本优先级的消息不包括在内。

 下面的配置文件是syslog.conf redhat 企业版5syslog配置文件

# Log all kernel messages to the console.
# Logging much else clutters up the screen.
#kern.*                                             /dev/console
# Log anything (except mail) of level infoor higher.
# Don't log private authenticationmessages!
*.info;mail.none;authpriv.none;cron.none            /var/log/messages
# The authpriv file has restricted access.
authpriv.*                                          /var/log/secure
# Log all the mail messages in one place.
mail.*                                                -/var/log/maillog
# Log cron stuff
cron.*                                               /var/log/cron
# Everybody gets emergency messages
*.emerg                                             *
# Save news errors of level crit and higherin a special file.
uucp,news.crit                                          /var/log/spooler
# Save boot messages also to boot.log
local7.*                                      /var/log/boot.log

syslog使用的接口

在实际的使用过程中,我们可以通过配置文件和查看相应的日志文件来使用syslog。然而,在许多应用场景下,我们往往需要通过程序产生输出信息并进行记录,也就是说要把一些信息写成日志文件,正常情况下运行程序的人不用关心日志里的内容,只有在出现问题的时候才会查看日志文件里的内容以确定问题所在。因此,下面将详细介绍如何通过syslog日志系统提供的API调用接口,来使用程序实现对syslog的使用。

  1.主要的函数

  在Linux中,提供了四个有关syslog日志系统的系统调用,供用户使用:

  openlog:打开日志设备,以供读取和写入,与文件系统调用的open类似;

  syslog:写入日志,与文件系统调用的write类似;

  closelog:关闭日志设备,与文件系统调用的close类似;

  vsyslog:它和syslog功能一样,负责写入日志,只是参数格式不同。

下面给出一个使用上述几个函数写日志的例子,以供大家参考:

  #include <syslog.h>
  #include <sys/klog.h>
  #include <stdio.h>
  int main(void)
  {
		
		int log_test;
  	/*打开日志*/
  	openlog("log_test ", LOG_PID|LOG_CONS, LOG_USER);
  	/*写日志*/
  	syslog(LOG_INFO, "PID information, pid=%d", getpid());
  	syslog(LOG_DEBUG,"debug message ");
  	/*关闭日志*/
  	closelog();
  }

inetd 守护进程

       我们在网络编程时会发现,开始的几步都是基本一样的,对于服务器这一端,我们会使用socket, bind, listen ,accept 基本步骤相同,能不能把这几步形成一个总的,当有申请链接来时都调用一个进程链接,然后根据不同的申请fork子进程执行相应的程序呢?答案就是只用inetd守护进程。

       inetd守护进程是Linux自己的,他作为一个守护进程,处理请求,我们要做的是给他提供当对于某种链接,某个接口的请求时所要启动的程序就可以了。

       一般在/etc/inetd.conf中配置。

例如:

ftp   stream     tcp   nowait     root        /usr/bin/ftpd    ftpd –l

下面是针对上面的参数进行解释,一一对应。

service-name    必须是在/etc/services文件中已定义的服务名

socket-tye    stream(TCP)或dgram(UDP)

protocol      不许再/etc/protocols文件中已定义:tcp或者UDP

wait-flag      一般TCP是nowait,UDP是wait

login-name     /etc/passwd 中的用户名,一般为root

server-program exec使用的全路径名

server-program-arguments exec使用的参数

 

抱歉!评论已关闭.