在 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
(根据结果编辑问题)