守护进程daemon,一般是指 不受终端控制,不能直接和用户交互,自动运行在系统后台的进程。
一般对于 UNIX / LINUX 来说,守护进程往往都是托管在 init 的孤儿进程。命名上 普遍是以 d 结尾,比如 httpd、mysqld、memcached、crond、sshd 等。进程属性分辨上一般通过 TPGID、TTY 等:
|
|
凡是TPGID一栏写着-1的都是没有控制终端的进程,也就是守护进程。在COMMAND一列用[]括起来的名字表示内核线程,这些线程在内核里创建,没有用户空间代码,因此没有程序文件名和命令行,通常采用以k开头的名字,表示Kernel。init进程我们已经很熟悉了,udevd负责维护/dev目录下的设备文件,acpid负责电源管理,syslogd负责维护/var/log下的日志文件,可以看出,守护进程通常采用以d结尾的名字,表示Daemon。
会话、进程组、控制终端
- 会话:又称为session,我们正常登录 shell 之后整个 shell 程序可以看做一个会话
- 进程组:一个会话可以有多个进程组,如果此会话有控制终端,则会有一个前台进程组和若干个后台进程组
控制终端:一个会话最多只有一个控制终端或者没有,如果 ssh登录 或 通过命令 gnome-terminal 打开一个 shell ,则默认会打开一个终端与此 shell 对应,在Linux上,通常指的是虚拟终端,也就是
/dev/pts/x
,可以执行tty
命令查看目前 shell 对应的终端12345678[wettper@web-lovers experiment_demo]$ ps -o pid,ppid,pgid,sid,tty,comm | morePID PPID PGID SID TT COMMAND8921 2813 8921 8921 pts/7 bash13624 8921 13624 8921 pts/7 ps13625 8921 13624 8921 pts/7 more[wettper@web-lovers experiment_demo]$ tty/dev/pts/7三个进程的
SID
都一样8921
,属于同一个会话,对应终端为pts/7
ps
和more
的PPID
是一样的8921
,而8921
进程号对应的是COMMAND
为bash
,证明bash
为这个会话的首领(父进程)ps
和more
的PGID
是一样的,证明他们同属一个进程组
守护进程特征
- 后台运行
- 脱离 会话 和 进程组
- 禁止进程重新打开控制终端
- 关闭打开的文件描述符:
进程从创建它的父进程那里继承了打开的文件描述符。如不关闭,将会浪费系统资源,造成进程所在的文件系统无法卸下以及引起无法预料的错误
- 改变当前工作目录:
进程活动时,其工作目录所在的文件系统不能卸下。一般需要将工作目录改变到根目录。对于需要转储核心,写运行日志的进程将工作目录改变到特定目录
- 重设文件描述符:
守护进程可能需要创建日志文件,因此将umask置为0,默认文件权限则为:666-000
- 处理 SIGCHLD 型号:
忽略或者处理信号SIGHUP(进程和控制终端分离时收到SIGHUP)、 SIGTERM(系统关机之前收到SIGTERM
守护进程实例
示例项目源码: daemonize.c
|
|
本文作者: wettper
本文链接: http://www.web-lovers.com/c-daemonize.html
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 3.0 许可协议。转载请注明出处!