用shell写个service启动程序


我们经常会用到service httpd.d start,service mysql start

那么service到底是怎么工作的呢?




0x01.关于service

打开terminal,输入 ls /etc/init.d/可以看到很多文件。

这些就是我们常用到的service 命令集合,其实就是Linux Shell执行脚本。

我们经常用service开启服务,原理就是,开启服务线程,终止服务线程。

service基础格式如下:

# /bin/sh

start(){}
stop(){}
reload(){}
status(){}

case "$1" in
    start)
            start 
            ;;
    stop)
            stop 
            ;;
    restart)
            stop
            start
            ;;
    reload)
            reload
    ;;
    status)
            status
            ;;
    *)
            echo $"Usage: $0 {start|stop|restart|reload|status}" 
esac

可以看出来,这个service包含了{start|stop|restart|reload|status}等几个参数命令。


$1是脚本的一个参数,关于linux shell参数,看下面:

*     $0 : ./homeway.sh,即命令本身,相当于C/C++中的argv[0]
*    $1 : -f,第一个参数.
*    $2 : config.conf
*    $3, $4 ... :类推。
*    $#  参数的个数,不包括命令本身,上例中$#为4.
*    $@ :参数本身的列表,也不包括命令本身,如上例为 -f config.conf -v --prefix=/home
*    $* :和$@相同,但"$*" 和 "$@"(加引号)并不同,"$*"将所有的参数解释成一个字符串,而"$@"是一个参数数组。

0x02.写一个nginx启动service

* 先配置变量

PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
NAME=nginx
NGINX_BIN=/usr/local/nginx/sbin/$NAME
CONFIGFILE=/usr/local/nginx/conf/$NAME.conf
PIDFILE=/usr/local/nginx/logs/$NAME.pid
SCRIPTNAME=/etc/init.d/$NAME


关于start

start() {
    echo -n "Starting $NAME... "
    if netstat -tnpl | grep -q nginx;then
        echo "$NAME (pid `pidof $NAME`) already running."
        exit 1
    fi
    $NGINX_BIN -c $CONFIGFILE
    if [ "$?" != 0 ] ; then
        echo " failed"
        exit 1
    else
        echo " done"
    fi
}

这个函数通过 netstat -tnpl | grep -q nginx 检测nginx是否启动。

$NGINX_BIN -c $CONFIGFILE命令用于启动nginx线程。

关于stop

stop() {
    echo -n "Stoping $NAME... "
    if ! netstat -tnpl | grep -q nginx; then
        echo "$NAME is not running."
        exit 1
    fi
    $NGINX_BIN -s stop

    if [ "$?" != 0 ] ; then
        echo " failed. Use force-quit"
        exit 1
    else
        echo " done"
    fi
}

一样的,通过 ! netstat -tnpl | grep -q nginx检测nginx是否启动。

$NGINX_BIN -s stop 关闭nginx线程,我们需要知道nginx启动pid,这个在配置文件中设置,如果我nginx安装在 /usr/local/nginx/,那么配置文件在 /usr/local/nginx/conf/nginx.conf




0x03.保存并运行

假设 nginx 安装在 /usr/local/nginx

添加 nginx service

vim /etc/init.d/nginx

具体代码保存在http://xiaocao.u.qiniudn.com/blog%2Fnginx-service.sh

设置权限

chmod +x /etc/init.d/nginx

然后运行下试试。

service nginx restart




本文出自 夏日小草,转载请注明出处:http://homeway.me/2014/10/29/linux-shell-write-service/


-by小草

2014-10-29 12:08:11

Fork me on GitHub