共计 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
————————————– 分割线 ————————————–