@HUST张友东 work@taobao zyd_com@126.com
分类: LINUX
2010-09-16 15:00:41
http://blog.chinaunix.net/u2/87570/showart_2048930.html介绍了如何编写守护进程,其实linux提供了将进城在后台运行的函数daemon。
#include
int daemon(int nochdir, int noclose);
1. daemon()函数主要用于希望脱离控制台,以守护进程形式在后台运行的程序。
2. 当nochdir为0时,daemon将更改进城的根目录为root(“/”)。
3. 当noclose为0是,daemon将进城的STDIN, STDOUT, STDERR都重定向到/dev/null。
进程在后台运行后,应该如何管理(启动,停止,重启等)它呢,怎样实现/etc/init.d/xxx start | stop | restart| status的方式管理进程。
/etc/init.d中的每个文件对应一个shell脚本,脚本中包含了启动,停止某个服务的函数,为此我们必须为我们要管理的服务编写一个脚本(以dnfs-server为例),首先在svc_run之前将进城daemon化,然后编写一个dnfs-server的脚本(如下所示),并将其拷贝到/etc/init.d目录下,接下来就可以使用/etc/init.c/dnfs-server start | stop | restart | status的方式管理dnfs-server服务了。
为了编写dnfs-server脚本,需要借助/etc/init.d/functions中的一些工具函数,如daemon、killproc,前者用于启动进程,后者用于杀掉进程。另外为了标示服务状态以及只允许服务启动一次,通过在启动后建立一个/var/lock/subsys/dnfs-server的文件进行标示,在服务停止后删除该文件,该文件相当于一个服务锁。通过这种方式,也很好的解决了http://blog.chinaunix.net/u2/87570/showart_2233655.html中启动脚本遇到的问题。
另外,由于daemon的STDIN, STDOUT, 都被重定向到/dev/null,故daemon程序不能输出信息,如果需要这些信息,可以以日志的方式记录,将daemon输出的数据写到日志文件中。
|