#! /bin/bash
#全局定义参数
PORT=11211
USER=root
MAXCONN=1024
CACHESIZE=64
OPTIONS=""
LOCAL="127.0.0.1"
RETVAL=0
prog="memcached"

#定义$1的参数,例如/etc/init.d/memcached start   ,这里的start就是$1参数    创建PID和touch/var/lock/subsys/ ,详解看下面的收缩栏
start () {
    echo -n $"Starting $prog: "
    memcached -d -p $PORT -u $USER -l $LOCAL-m $CACHESIZE -c $MAXCONN -P /var/run/memcached.pid $OPTIONS
    RETVAL=$?
    echo
    [ $RETVAL -eq 0 ] && touch /var/lock/subsys/memcached
}

stop () {
    echo -n $"Stopping $prog: "
    kill `cat /var/run/memcached.pid`
    RETVAL=$?
    echo
    if [ $RETVAL -eq 0 ] ; then
        rm -f /var/lock/subsys/memcached
        rm -f /var/run/memcached.pid
    fi
}

restart () {
    stop
    start
}


# 通过$1来判断参数起的哪个定义
case "$1" in
    start)
        start
        ;;
    stop)
    stop
    ;;
    restart|reload)
    restart
    ;;
    *)
    echo $"Usage: $0 {start|stop|status|restart|reload}"
    exit 1
esac

exit $?

touch /var/lock/subsys/memcached 详解

判断是否有实例正在运行,也相当于判断是否上锁就是判断这个文件在与否,也就隐含了是否上锁。而这个目录的内容并不能表示一定上锁了,因为很多服务在启动脚本里用touch来创建这个加锁文件,在系统结束时该脚本负责清除锁,这本身就不可靠(比如意外失败导致锁文件仍然存在)

所以脚本里一般是结合PID文件(如果有PID文件的话),从PID文件里得到该实例的PID,然后用ps-ef来判断是否存在该PID,从而判断是否真正有这个实例在运行,更加稳妥的方法是用进程通讯了,不过这样的话单单靠脚本就做不到了
所以启动停止重启脚本一般结合了touch /var/lock/subsys/xxx 和 PID来判断