阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

守护进程Xinted和日志记录Syslogd

141次阅读
没有评论

共计 2998 个字符,预计需要花费 8 分钟才能阅读完成。

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 http://www.linuxidc.com/Linux/2012-01/51853.htm

CentOS 6.3 下利用 Rsyslog+LogAnalyzer+MySQL 部署日志服务器 http://www.linuxidc.com/Linux/2013-07/86956.htm

使用 rsyslog mysql 和 logAnalyzer 的日志服务器 http://www.linuxidc.com/Linux/2012-09/70717.htm

CentOS 6.3 下利用 Rsyslog+LogAnalyzer+MySQL 部署日志服务器 http://www.linuxidc.com/Linux/2013-07/86956.htm

RHEL5.4 部署中央日志服务器之 rsyslog+loganalyzer  http://www.linuxidc.com/Linux/2010-12/30801.htm

————————————– 分割线 ————————————–

正文完
星哥说事-微信公众号
post-qrcode
 0
星锅
版权声明:本站原创文章,由 星锅 于2022-01-20发表,共计2998字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中