现在的位置: 首页 > 综合 > 正文

daemon进程的管理

2012年09月23日 ⁄ 综合 ⁄ 共 2037字 ⁄ 字号 评论关闭

http://blog.chinaunix.net/u2/87570/showart_2048930.html介绍了如何编写守护进程,其实linux提供了将进城在后台运行的函数daemon

 

#include <unistd.h>

int daemon(int nochdir, int noclose);

1 daemon()函数主要用于希望脱离控制台,以守护进程形式在后台运行的程序。

2 nochdir0时,daemon将更改进城的根目录为root(“/”)

3 noclose0是,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中的一些工具函数,如daemonkillproc,前者用于启动进程,后者用于杀掉进程。另外为了标示服务状态以及只允许服务启动一次,通过在启动后建立一个/var/lock/subsys/dnfs-server的文件进行标示,在服务停止后删除该文件,该文件相当于一个服务锁。通过这种方式,也很好的解决了http://blog.chinaunix.net/u2/87570/showart_2233655.html中启动脚本遇到的问题。

 

另外,由于daemonSTDIN, 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

 
 
 

 


 

抱歉!评论已关闭.