不要运行重复的服务实例

时间:2015-02-13 20:34:08

标签: linux bash service scripting

我正在为kibana

编写一个init.d脚本

从非脚本运行部分,但问题是如果我运行运行服务kibana启动即使服务正在运行然后第二个实例启动困扰我我想在启动服务之前添加检查,如果服务正在运行然后不启动第二审。我试图检查“/ var / lock / subsys / kibana”但是没有用。这是我的剧本:

#!/bin/bash

KIBANA_PATH="/opt/kibana4"
DESC="Kibana Daemon"
NAME=kibana
DAEMON=bin/kibana
CONFIG_DIR=$KIBANA_PATH/config/kibana.yml
LOGFILE=/var/log/kibana/kibana.log
#ARGS="agent --config ${CONFIG_DIR} --log ${LOGFILE}"
SCRIPTNAME=/etc/init.d/kibana
PIDFILE=/var/run/kibana.pid
base=kibana

# Exit if the package is not installed
if [ ! -x "$KIBANA_PATH/$DAEMON" ]; then
{
  echo "Couldn't find $DAEMON"
  exit 99
}
fi

. /etc/init.d/functions

#
# Function that starts the daemon/service
#

do_start()
{
       cd $KIBANA_PATH && \
       ($DAEMON >> $LOGFILE &) && \
       success || failure;
}

set_pidfile()
{
  pgrep -f "kibana.jar" > $PIDFILE
}

#
# Function that stops the daemon/service
#

do_stop()
{
  pid=`cat $PIDFILE`
                   if checkpid $pid 2>&1; then
                       # TERM first, then KILL if not dead
                       kill -TERM $pid >/dev/null 2>&1
                       usleep 100000
                       if checkpid $pid && sleep 1 &&
                          checkpid $pid && sleep $delay &&
                          checkpid $pid ; then
                            kill -KILL $pid >/dev/null 2>&1
                            usleep 100000
                       fi
                    fi
                    checkpid $pid
                    RC=$?
                    [ "$RC" -eq 0 ] && failure $"$base shutdown" || success $"$base shutdown"

}

case "$1" in
  start)
    echo -n "Starting $DESC: "
    do_start
    touch /var/lock/subsys/$NAME
    set_pidfile
    ;;
  stop)
    echo -n "Stopping $DESC: "
    do_stop
    rm /var/lock/subsys/$NAME
    rm $PIDFILE
    ;;
  restart|reload)
    echo -n "Restarting $DESC: "
    do_stop
    do_start
    touch /var/lock/subsys/$NAME
    set_pidfile
    ;;
  status)
    echo $DESC
    status -p $PIDFILE
    echo $!
    ;;
  *)
    echo "Usage: $SCRIPTNAME {start|stop|status|restart}" >&2
    exit 3
    ;;
esac

echo
exit 0

这里有什么帮助吗?

由于

2 个答案:

答案 0 :(得分:2)

启动服务时使用lockfile -r0 /path/to/lock/file.lck。然后,每个新访问将重试零次以创建文件。因此,如果该命令失败则不执行任何操作或以其他方式启动服务。

lockfile -r0 /path/to/lock/file.lck
if [ "$?" == "0" ]; then
  echo "lock does not exist. enter devils land :)"
fi

答案 1 :(得分:0)

以下是大多数init.d脚本使用此功能的非常标准的实现。

start () {
    [ -d /var/run/nscd ] || mkdir /var/run/nscd
    [ -d /var/db/nscd ] || mkdir /var/db/nscd
    echo -n $"Starting $prog: "
    daemon /usr/sbin/nscd $NSCD_OPTIONS
    RETVAL=$?
    echo
    [ $RETVAL -eq 0 ] && touch /var/lock/subsys/nscd
    return $RETVAL
}
...

# See how we were called.
case "$1" in
    start)
        [ -e /var/lock/subsys/nscd ] || start
        RETVAL=$?
        ;;
...