在大部分情况下,守护进程是长时间运行在系统中的。为项目提供一种服务,如vsftp,dnfs-server等等。所以很多时候都需要能够进行方便的管理,如简单的开启、关闭、重启命令,开启自启动。那么如何实现守护进程的管理呢?就像vsftp (start | stop | restart | status)一样?下面以前面的demo为例,介绍如何进行进程的管理及服务的开机启动。
一、进程管理
在linux系统中,/etc/init.d目录下存放着系统安装的一些服务程序的管理脚本,里面包含了进程的开启、关闭、重启及状态查询。所以我们需要编写一个脚本放到/etc/init.d目录下进行进程的管理。下面是一个简单的管理代码,及相应的说明。
-
#!/bin/bash
-
#
-
#/etc/rc.d/init.d/sdaemon_log
-
#
-
# sdaemon_log This shell script takes care of starting and stopping sdaemon_log.
-
#
-
# description: sdaemon_log is the meta data server of demo.
-
-
# Source function library
-
# 引用其他脚本文件的函数
-
if [ -f /etc/rc.d/init.d/functions ]; then
-
. /etc/rc.d/init.d/functions
-
else
-
. /lib/lsb/init-functions
-
fi
-
-
RETVAL=0
-
prog="daemon_log"
-
-
start()
-
{
-
# Start daemons.
-
echo -n "Starting $prog ..."
-
echo ""
-
[ -r /var/lock/$prog ] && echo $prog is started && return 0 # 建立文件,限制服务只运行一次
-
start_daemon /usr/local/bin/$prog # daemon 化程序,运行程序
-
RETVAL=$?
-
echo
-
[ $RETVAL -eq 0 ] && touch /var/lock/$prog
-
return $RETVAL
-
}
-
-
stop()
-
{
-
# Stop daemons.
-
echo -n "Shutting down $prog ..."
-
echo ""
-
# killproc $prog
-
killall $prog # 删除进程
-
-
RETVAL=$?
-
echo
-
[ $RETVAL -eq 0 ] && rm -f /var/lock/$prog # 删除文件锁
-
return $RETVAL
-
}
-
-
-
status()
-
{
-
[ -r /var/lock/$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
有几点需要说明:
1、引用其他脚本文件的函数,这里用了两个daemon、killproc。在redhat、centos等系统中,这两个函数存在于/etc/rc.d/init.d/functions文件中
,而我测试的环境是ubuntu10.04,没有这个文件,所以引用了/lib/lsb/init-functions函数库。脚本开始处进行了判断。而且daemon函数名改成了start_daemon。(关于lsb脚本的更多知识,请询问度娘)
2、一般的服务程序在本机中只提供一个副本,所以需要加入文件锁进行多次运行的控制。这个根据需要,有些服务可能需要提供多个副本。
3、删除进程时,脚本引用的函数库中有killproc函数,原理是根据进程名删除进程,但是在我的测试环境中始终不能删除进程,所以使用了killall命令,达到了相同的效果,redhat可以使用killproc这个函数删除。
4、将上面的脚本,拷贝到/etc/init.d目录下命名为sdaemon_log,并增加执行权限 sudo chmod +x sdaemon_log。可以进行进程维护了:
sdaemon_log start
sdaemon_log stop
sdaemon_log restart
sdaemon_log status
二、服务开机启动(ubuntu)
将守护进程加入到开机启动的脚本中需要下面的命令(redhat及其他系统,请参照chkconfig的使用):
sudo update-rc.d sdaemon_log defaults
运行后结果:
重启系统,daemon_log 就会随机启动了
通过下面的命令可以进行管理服务的启动/结束.
sudo service mongodb stop
sudo service mongodb start
服务的卸载通过sudo update-rc.d -f sdaemon_log remove 命令
阅读(2873) | 评论(0) | 转发(0) |