精灵进程

2016-03-12

精灵进程

精灵进程是生存期长的一种进程。它们常常在系统引导装入时启动,在系统关闭时终止。因为它们没有控制终端,所以说它们是在后台运行的。unix系统有很多精灵进程,它们执行日常事务活动。

精灵进程的特征

syslogd精灵进程可用于任何为操作人员记录系统消息的程序中。可以在一台实际的控制台上打印这些消息,也可以将它们写到一个文件中。sendmail是标准邮递精灵进程。update程序定期将内核缓存中的内容写到硬盘上。为了做到这一点,改程序每隔30秒调用sync函数一次。corn精灵进程在指定的日期和时间执行指定的命令。许多系统管理任务是由corn定期地使相关程序执行而得以实现。inetd精灵进程坚挺系统的网络界面,以输入对各种网络服务器的请求。lpd进程处理对系统提出的各个打印请求。
所有的精灵进程都以超级用户的优先权裕兴。没有一个精灵进程具有控制终端。缺少控制终端可能呢是精灵进程调用了setsid的结果。除update以外的所有精灵进程都是进程组的首进程,对话期的首进程,而且是这些进程组和对话期中的唯一进程。update是它所在进程组和对话期的唯一进程,但是该进程组的首进程已终止。最后多有这些精灵进程的父进程都是init进程。

编程规则

  • 首先是fork,然后使父进程exit。这样做实现了:1、如果该精灵进程是由一条简单的shell命令启动的,那么使父进程终止使得shell认为这条命令已经执行完成了。2、子进程继承了父进程的进程组id,但具有一个新的进程id,这就保证了子进程不是一个进程组的首进程。这对于下面就要做得setsid调用是必要的前提条件。
  • 调用setsid以创建一个新的会话期。于是使调用进程成为新的对话期的首进程;成为一个新进程组的首进程;没有控制终端。
  • 将当前工作目录更改为根目录。从父进程集成过来的当前工作目录可能在一个装配的文件系统中。因为精灵进程通常在系统再引导之前是一直存在的,所以如果精灵进程的当前工作目录在一个装配文件系统中,那么该文件系统就不能被拆卸。另外,某些精灵进程可能会把当前工作目录更改到指定的位置,在此位置做他们的工作。
  • 将文件方式创建屏蔽字设置为0.由继承得来的文件方式创建屏蔽字可能会拒绝设置某些许可权。例如若精灵进程要创建一个组可读写的文件,而继承的文件方式创建屏蔽字,屏蔽了这两种许可权,则所要求的组可读写就不能起作用。
  • 关闭不在需要的文件描述符。这样使精灵进程就不在持有从父进程继承来的文件描述符。但是,究竟关闭那些描述符则与具体的精灵进程有关。

出错记录

因为精灵进程没有控制终端,所以其出错消息不能写到标准出错输出上。在很多工作站上,控制台设备运行一个窗口系统,所以我们不希望所有精灵进程都写到控制台设备上。我们也不希望每个精灵进程将它的出错消息写到一个单独的文件中。对系统管理人员而言,如果要关心哪一个精灵进程写到哪一个记录文件中,并定期检查这些文件,那么一定会使他感到头痛。

SVR4流log驱动程序

SCR4提供了一种流设备驱动程序,其界面具有流出错记录,流事件跟踪以及控制台记录功能。
有三个记录进程:出错记录进程、跟踪记录进程以及控制台记录进程。每一条记录消息可以送给其中之一。
产生记录消息:

  • 内核中的历程可以调用strlog以产生记录消息。这种方法通常由流模块和流设备驱动程序用于出错消息或跟踪消息。
  • 一个用户进程(例如一个精灵进程)可以用putmsg将消息送到/dev/log.这种消息可悲送到三个记录进程中的任意一个。
  • 一个用户进程可以用write将消息写到/dev/conslog。这种消息只能送像控制台记录进程。

读记录消息

  • 标准的出错记录是strerr。它将记录消息增写到在目录/var/adm/stream下的一个文件中.该文件名是error.mm-dd srtrerr本身是个精灵进程,通常在后台运行,它将消息增写到该文件中
  • 标准的跟踪记录进程是strace 它能有选择地将一套指定的跟踪消息写至其标准输出。
  • 标准控制台记录进程是syslogd,这是一个BSD导出程序。此进程是个精灵进程,它读一个配置文件,然后将记录消息写至一个指定的文件或登录用户,或将消息发送给另一台主机上的syslog精灵进程。
    虽然上面没有提及,但用户也可以用自己的进程替换任意一个系统提供的标准精灵进程。我们可以提供自己的出错记录进程、跟踪记录进程或控制台记录进程。

每则log消息除消息本身外,还包含有一些其他信息。例如,由log驱动程序沿逆流方向发送的消息,还包含下列消息:那个模块产生的此消息 级别优先级 某些标准及消息产生的时间。如果使用putmsg产生一则log消息,则可以设置这些字段中的几个。如果调用write将一则消息发送至控制台记录进程,则只能发送消息字符串。

4.3+BSD syslog设施

自4.2BSD以来,广泛地应用了BSDsyslog设施。大多数精灵进程使用这一设施。
有三种方法产生记录消息

  • 内核历程可以调用log函数。任何一个用户进程通过打开和读/dev/klog设备就可以读取这些消息。
  • 大多数用胡金成调用syslog函数以产生记录消息。这使消息发送至Unix域数据报套接口 /dev/log
  • 在此主机上,或通过tcp/ip网络连接到此主机的某一其他主机上的一个用户进程可将记录消息发向udp端口514.

通常syslogd精灵进程读取三种格式的记录消息。此精灵进程在启动时读一个配置文件。一般,其文件名为/etc.syslog.conf,该文件决定了不停累的消息应送向何处。
该设施的界面是syslog函数
void openlog(char *ident, int option, int facility)
void syslog(int *priority, char *format, ...)
void closelog(void)
调用openlog是可选择的。如果不调用openlog,则在第一次调用syslog时,自动调用openlog。调用closelog也是可选择的,它只是关闭被用于与syslogd精灵进程通信的描述符。
调用openlog使我们可以指定一个ident,以后此ident将被添加至每则记录消息中。ident一般是程序的名称。option可以是

  • LOG_CONS 若日志罅隙,不能通过Unix域数据报发送至syslogd,则将该消息写至控制台
  • LOG_NDELAY1 立即打开unix域数据报套借口至syslsgd精灵进程,不要等到记录第一条消息。
  • LOG_PERROR 除将日志消息发送给syslog外,还将它写至标准出错。
  • LOG_PID 每条消息都包含进程id此选项可供对每个请求都fork一个子进程的精灵进程使用

openlog中facility是让配置文件可以说明,来自不同设施的消息以不同的方式进行处理。如果不调用openlog或者以facility为0来调用它,那么在调用syslog时,可以将facility作为priority参数的一个部分进行说明。
调用syslog产生一个消息记录。其prority参数是facility和level的组合,它们可选取的值分别列于facility和level中。
format参数以及其他参数传至vsprintf函数以便进行格式化。在format中,每个%m都被戴汉成对应于errno值得出错消息字符串(strerror)
facility参数

  • LOG_AUTH 授权程序:login.su, getty,...
  • LOG_CRON cron和at
  • LOG_DRAEMON 系统精灵进程:ftpd,routed
  • LOG_KERN 内核产生的消息
  • LOG_LOCAL0 保留本地使用
  • LOG_LOCAL1 保留本地使用
  • LOG_LOCAL2 保留本地使用
  • LOG_LOCAL3 保留本地使用
  • LOG_LOCAL4 保留本地使用
  • LOG_LOCAL5 保留本地使用
  • LOG_LOCAL6 保留本地使用
  • LOG_LOCAL7 保留本地使用
  • LOG_LPR 行打系统:lpd,lpc,...
  • LOG_MAIL 邮件系统
  • LOG_NEWS Usenet网络新闻系统
  • LOG_SYSLOG syslogd精灵进程本身
  • LOG_USER 来自其他用户进程的消息
  • LOG_UUCP UUCP系统

syslog中的levels

  • LOG_EMERG 紧急
  • LOG_ALERT 必须立即修复的条件
  • LOG_CRIT 临界条件
  • LOG_ERR 出错条件
  • LOG_WARNING 警告条件
  • LOG_NOTICE 正常但重要的条件
  • LOG_INFO 信息性消息
  • LOG_DEBUG 调试排错消息

客户机-服务器模型

精灵进程常常作为服务器进程。可以称syslogd进程为服务器,用户进程用unix域数据报套接口向其发送消息。
一般而言,服务器是一个进程,它等待客户机与其联系,提出某种类型的服务要求。

你可能感兴趣的:(精灵进程)