Linux守护进程

守护进程一般在系统启动的时候启动,在系统关闭的时候才会退出, Linux的大多数服务器都是以守护进程的形式实现。因为在后台运行,也叫后台进程,独立于终端运行,故输出需要特殊处理。

守护进程的父进程是init进程,因为其真正父进程在fork()出子进程就立即退出了,将子进程交给init托管。

进程组
每个进程的进程组ID就是组长的ID,进程只能为自己或其子进程设置组ID。
会话
新建会话的目的主要是解除原有的会话,另一方面因为如果该进程是组长,就无法建立新会话,所以要先fork()一个子进程。

编写守护进程需要完成如下步骤:

  1. 父进程fork()并退出。
  2. 子进程umask(0)
  3. 子进程setsid()创建新会话。
  4. 子进程chdir("/")切换工作目录,如果不切换工作目录可能导致进程占用文件系统,使文件系统无法卸载。
  5. 子进程关闭所有不用的文件描述符。

以上这些步骤可以通过一个函数来完成,Linux提供了daemon()函数用于执行通用步骤。

int daemon(int nochdir, int noclose);

编写守护进程同时需要遵循一些惯例,包括如下几点。

  • 如果后台进程试图创建文件,如日志文件、锁住文件来实现单实例等,文件应该在/var/run目录下创建。
  • 如果需要配置文件,配置文件应该在/etc目录下创建。

在Linux系统下,不同的发行版日志系统有所不同,以Ubuntu为例。

/var/log/auth.log
授权日志,包括ssh、su登录信息。
/var/log/daemon.log
守护进程日志,如gdm、mysqld等。
/var/log/kern.log
内核日志,由操作系统内核发出。
/var/log/dmesg
内核循环缓冲日志,可以通过dmesg查看。
/var/log/syslog
系统日志,syslog()函数将消息输出到该文件。