守护进程的特征
编程规则
首先要做的是调用 umask 将文件模式创建屏蔽字设置为一个已知值
调用 fork,然后使父进程 exit
-
调用setsid 创建一个新会话:使调用进程:(a)成为
新会话的首进程,(b)成为一个新进程组的组长进程,(c)没有控制终端
将当前工作目录更改为根目录
关闭不再需要的文件描述符
某些守护进程打开/dev/null 使其具有文件描述符 0、1 和2
出错记录
3 种产生日志消息的方法
- 内核例程可以调用 log 函数
- 大多数用户进程(守护进程)调用 syslog(3)函数来产生日志消息
- 无论一个用户进程是在此主机上,还是在通过 TCP/IP 网络连接到此主机的其他主机上,
都可将日志消息发向 UDP 端口 514
syslogd 守护进程读取所有 3 种格式的日志消息
- 紧急消息可发送至系统管理员(若已登录)
- 警告消息则可记录到一个文件中
#include <syslog.h>
void openlog(const char *ident, int option, int facility);
void syslog(int priority, const char *format, ...);
void closelog(void);
int setlogmask(int maskpri);
#include <syslog.h>
#include <stdarg.h>
void vsyslog(int priority, const char *format, va_list arg);
单实例守护进程
lockfile(fd)
守护进程的惯例
若守护进程使用锁文件,那么该文件通常存储在/var/run 目录中(可能需要具有超级用户权限才能在此目录下创建文件),锁文件的名字通常是 name.pid,其中,name 是该守护进程或服务的名字。例如,cron 守护进程锁文件的名 字是/var/run/crond.pid
若守护进程支持配置选项,那么配置文件通常存放在/etc 目录中。配置文件的名字通常 是 name.conf,其中,name 是该守护进程或服务的名字
守护进程可用命令行启动, 但通常它们是由系统初始化脚本之一(/etc/rc或 /etc/init.d/)启动的。如果在守护进程终止时,应当自动地重新启动它,则我们可 在/etc/inittab 中为该守护进程包括 respawn 记录项,这样,init 就将重新启动该 守护进程。下面是centos7的inttab文件,已被取代
# inittab is no longer used when using systemd.
#
# ADDING CONFIGURATION HERE WILL HAVE NO EFFECT ON YOUR SYSTEM.
#
# Ctrl-Alt-Delete is handled by /usr/lib/systemd/system/ctrl-alt-del.target
#
# systemd uses 'targets' instead of runlevels. By default, there are two main targets:
#
# multi-user.target: analogous to runlevel 3
# graphical.target: analogous to runlevel 5
#
# To view current default target, run:
# systemctl get-default
#
# To set a default target, run:
# systemctl set-default TARGET.target
#