init.d 腳本在 Ubuntu 10.10 上執行良好,但在 11.10 上執行良好,儘管 LBS 標頭更正
在 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
(用結果編輯問題)