Linux守护进程
Linux守护进程
守护进程一般在系统启动的时候启动,在系统关闭的时候才会退出, Linux的大多数服务器都是以守护进程的形式实现。因为在后台运行,也叫后台进程,独立于终端运行,故输出需要特殊处理。
守护进程的父进程是init进程,因为其真正父进程在fork()出子进程就立即退出了,将子进程交给init托管。
- 进程组
- 每个进程的进程组ID就是组长的ID,进程只能为自己或其子进程设置组ID。
- 会话
- 新建会话的目的主要是解除原有的会话,另一方面因为如果该进程是组长,就无法建立新会话,所以要先fork()一个子进程。
编写守护进程需要完成如下步骤:
- 父进程
fork()
并退出。 - 子进程
umask(0)
。 - 子进程
setsid()
创建新会话。 - 子进程
chdir("/")
切换工作目录,如果不切换工作目录可能导致进程占用文件系统,使文件系统无法卸载。 - 子进程关闭所有不用的文件描述符。
以上这些步骤可以通过一个函数来完成,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()函数将消息输出到该文件。