尽管进行了 LBS 标头修正,init.d 脚本在 Ubuntu 10.10 上运行良好,但在 11.10 上却无法正常运行

尽管进行了 LBS 标头修正,init.d 脚本在 Ubuntu 10.10 上运行良好,但在 11.10 上却无法正常运行

在 Ubuntu 11.10 上,如果我运行 /usr/bin/cserver -c /etc/cserver.conf &它会正常工作。

但如果我跑服务 cserver 启动或者/etc/init.d/cserver启动就像我在 10.10 上所做的那样,它不会。它只是说“正在启动 cServer”,这是我最后一次听到它。

脚本如下:

#!/bin/bash
#
### BEGIN INIT INFO
# Provides:          cserver
# Required-Start:    $remote_fs $syslog
# Required-Stop:     $remote_fs $syslog
# Should-Start:      $network $time
# Should-Stop:       $network $time
# Default-Start:     3 4 5
# Default-Stop:      0 1 2 6
# Short-Description: Start and stop the cserver server daemon
# Description:       Controls the cserver server daemon
### END INIT INFO
#
set -e
set -u
${DEBIAN_SCRIPT_DEBUG:+ set -v -x}

CSERVERDIR=/usr/bin
PROG=./cserver
OPTIONS=" -c /etc/cserver.conf > /dev/null 2>&1 &"

start() {
          echo -n "Starting cServer "
          cd $CSERVERDIR
      daemon $PROG $OPTIONS
          RETVAL=$?
          echo
          return $RETVAL
}
stop() {
          CSERVERPID=$(pidof cserver)
          if [ $CSERVERPID ] ; then
        echo -n "Stopping cServer "
            kill $(pidof cserver)
            RETVAL=$?
          else
            echo "cServer not running"
            RETVAL=1
          fi
          echo
          return $RETVAL
}
status() {
          CSERVERPID=$(pidof cserver)
          if [ $CSERVERPID ] ; then
            echo -n "cServer is running"
            RETVAL=0
          else
            echo -n "cServer is stopped"
            RETVAL=1
          fi
          echo
          return $RETVAL
}

# See how we were called.
RETVAL=0

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

exit $?

虽然我从未在原始服务器上执行过此操作,并且 sysv-rc-conf 显示它存在于列表中并从正确的级别开始,但我手动尝试执行 update-rc.d,它抱怨无效的 lsb 标头,这导致我出现此问题问题指导。因此我按照上面的方法更改了标题,它之前的样子如下:

#!/bin/bash
#
#
# chkconfig: 345 99 99
#
# description: cserver init
# processname: cserver

# Source function library.
# . /etc/rc.d/init.d/functions

现在,有关于“源函数库”的那一行,但是该目录甚至不存在,而且该行已被注释掉。

我已经检查了旧服务器上的权限和符号链接等,一切看起来都相同。

现在有点头晕和困惑 - 也许一双更新鲜、更有知识的眼睛能发现一些东西?谢谢。

更新和编辑:感谢 kubankczyk - 我采纳了你的建议,复制了另一个,发现 nginx 启动脚本是最简单的,最后得到了以下内容:

#!/bin/sh

### BEGIN INIT INFO
# Provides:          cserver
# Required-Start:    $local_fs $remote_fs $network $syslog
# Required-Stop:     $local_fs $remote_fs $network $syslog
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: starts the cserver server
# Description:       starts cserver using start-stop-daemon
### END INIT INFO

PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
DAEMON=/usr/bin/cserver
NAME=cserver
DESC=cserver
DAEMON_OPTS=" -c /etc/cserver.conf"

#test -x $DAEMON || exit 0
set -e
#set -u
#${DEBIAN_SCRIPT_DEBUG:+ set -v -x}

. /lib/lsb/init-functions


case "$1" in
    start)
        echo -n "Starting $DESC: "
        start-stop-daemon --start --quiet --pidfile /var/run/$NAME.pid \
            --exec $DAEMON -- $DAEMON_OPTS || true
        echo "$NAME."
        ;;

    stop)
        echo -n "Stopping $DESC: "
        start-stop-daemon --stop --quiet --pidfile /var/run/$NAME.pid \
            --exec $DAEMON || true
        echo "$NAME."
        ;;

    restart|force-reload)
        echo -n "Restarting $DESC: "
        start-stop-daemon --stop --quiet --pidfile \
            /var/run/$NAME.pid --exec $DAEMON || true
        sleep 1
        start-stop-daemon --start --quiet --pidfile \
            /var/run/$NAME.pid --exec $DAEMON -- $DAEMON_OPTS || true
        echo "$NAME."
        ;;

    status)
        status_of_proc -p /var/run/$NAME.pid "$DAEMON" cserver && exit 0 || exit $?
        ;;
    *)
        echo "Usage: $NAME {start|stop|restart|reload|force-reload|status|configtest}" >&2
        exit 1
        ;;
esac

exit 0

不确定是否正确,但至少它启动了服务!谢谢。

答案1

您的脚本是为 chkconfig(例如在 Suse Linux 中使用的)编写的,而不是为 update-rc.d 编写的。您现在能做的最好的事情(如果您不想使用 chkconfig)是从 /etc/init.d 中选择一些简单的脚本,阅读、理解、复制并更改为运行 cserver。

特别是,请验证命令“daemon”是否在脚本中与 & 符号正确结合使用。

开始排除最简单的情况的故障。暂时将 OPTIONS 更改为 OPTIONS=" -c /etc/cserver.conf"。仅测试裸脚本(如果这不起作用,则service cserver start无论标头是否为 LSB 都不起作用):

  su -
  export DEBIAN_SCRIPT_DEBUG=1
  /etc/init.d/cserver start 

(根据结果编辑问题)

相关内容