04 September 2014

守护进程没有控制终端,所以说它们是在后台运行的,其终端名设置为问号。

大多数用户层守护进程都是进程组的组长进程以及会话的首进程,而且是这些进程组和会话中的唯一进程。

用户层守护进程的父进程是init进程。

编程规则


  1. 调用umask将文件模式创建屏蔽字设置为一个已知值(通常是0);
  2. 调用fork,然后使父进程exit。这样做实现了以下几点。第一,如果该守护进程是作为一条简单的shell命令启动的,那么父进程终止会让shell认为这条命令已经执行完毕。第二,虽然子进程继承了父进程的进程组ID,但获得了一个新的进程ID,这就保证了子进程不是一个进程组的组长进程。这是下面将要进行的setsid调用的先决条件。
  3. 调用setsid创建一个新会话。发生:a、成为新会话的首进程b、成为一个新进程组的组长进程c、没有控制终端。
  4. 将当前工作目录更改为根目录或某个合适的位置。
  5. 关闭不需要的文件描述符。
  6. 某些守护进程打开/dev/null使其具有文件描述符0、1和2,这样,任何一个试图读标准输入、写标准输出或标准错误输出的操作都不会产生任何效果。

出错记录


  • 发送日志给syslogd
  • 自己写日志文件

单实例守护进程


为了正常运作,某些守护进程会实现为,在任一时刻只运行该守护进程的一个副本。

如果每一个守护进程创建一个有固定名字的文件,并在该文件的整体上加一把写锁,那么只允许创建一把这样的锁。在此之后创建写锁的尝试都会失败,这向后续守护进程副本指明已有一个副本正在运行。

守护进程的惯例


  • 若守护进程使用锁文件,那么该文件通常存储在/var/run目录中,锁的文件名通常是name.pid;
  • 若守护进程支持配置选项,那么配置文件通常存储在/etc目录中,配置文件名通常是name.conf;
  • 守护进程可用命令行启动;
  • 若一个守护进程有一个配置文件,当该文件被修改后,那么最好发送信号给守护进程,让其重度配置文件。