http://blog.chinaunix.net/u2/87570/showart_2048930.html介绍了如何编写守护进程,其实linux提供了将进城在后台运行的函数daemon。
#include <unistd.h>
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输出的数据写到日志文件中。
#!/bin/bash
#
#/etc/rc.d/init.d/dnfs-server
#
# dnfs-server This shell script takes care of starting and stopping dnfs-server.
#
# description: dnfs-server is the meta data server of dnfs.
# Source function library
. /etc/rc.d/init.d/functions
RETVAL=0
prog="dnfs-server"
start()
{
# Start daemons.
echo -n "Starting $prog ..."
[ -r /var/lock/subsys/$prog ] && return 0
daemon /usr/local/bin/$prog
RETVAL=$?
echo
[ $RETVAL -eq 0 ] && touch /var/lock/subsys/$prog
return $RETVAL
}
stop()
{
# Stop daemons.
echo -n "Shutting down $prog ..."
killproc $prog
RETVAL=$?
echo
[ $RETVAL -eq 0 ] && rm -f /var/lock/subsys/$prog
return $RETVAL
}
status()
{
[ -r /var/lock/subsys/$prog ] && echo $prog is started && return 0
echo $prog is stopped && return 0
}
# See how we were called.
case "$1" in
start)
start
;;
stop)
stop
;;
restart|reload)
stop
start
RETVAL=$?
;;
status)
status
RETVAL=$?
;;
*)
echo $"Usage: $0 {start|stop|restart|status}"
exit 1
esac
exit $RETVAL