Ubuntu

init.d 腳本在 Ubuntu 10.10 上執行良好,但在 11.10 上執行良好,儘管 LBS 標頭更正

  • December 19, 2011

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

但是,如果我像在 10.10 上那樣執行service cserver start或**/etc/init.d/cserver start**,則不會。它只是說“啟動 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

不確定是否正確,但至少它啟動了服務!謝謝。

您的腳本是為 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 

(用結果編輯問題)

引用自:https://serverfault.com/questions/341997