设置SVN自动启动--Ubuntu10.04

手头有一个项目要开发,需要一个源代码控制软件。最后选的是SVN。有关如何在Ubuntu上安装SVN, 请参考下面两篇文章,

http://odyniec.net/articles/ubuntu-subversion-server/

https://help.ubuntu.com/community/Subversion

 

这两篇文章对如何安装,配置基本的SVN有详细的介绍,我就不重复。主要补充一下如何添加自动启动脚本。

当然上面两篇文档都提到了去下一个脚本 ,然后放到/etc/init.d/目录下,但是这个脚本还是有些问题的,有可能是因为比较老或者作者的环境和我不一样造成的。

 

首先,我遇到的一个问题是,这个脚本能启动SVN,但是PID文件不能生成。

 

do_start()
{
    start-stop-daemon --start --quiet --pidfile $PIDFILE --exec $DAEMON --test > /dev/null /
        || return 1
    start-stop-daemon --start --quiet --pidfile $PIDFILE --exec $DAEMON -- /
        $DAEMON_ARGS /
        || return 2
}

 

查了相关文档,发现start-stop-daemon有个参数--make-pidfile可以自动生成PID文件。添加这个参数后,PID文件生成了,但是又一个问题,就是写到这个文件里的PID和进程里显示的PID是不匹配的,造成无法Stop。

查看了start-stop-daemon的帮助,里面说,--make-pidfile可以生成PID文件,但是是在进程运行之前。Faint了,这个说法也就是说,生成这个文件时取得PID值,不一定就是真正的PID值。我看到好多文章提到说,在使用--make-pidfile,而且PID值是匹配的,不知道他们怎么做到PID值匹配的。

最后解决的办法,svnserve命令本身,可以带一个参数来自动生成PID文件,--pid-file。 这个才是我真正想要的,而且能解决PID不匹配的问题。

usr/bin/svnserve -d -r /opt/svnproject --pid-file=$PIDFILE, 这个才是运行svnserve需要的命令。

 

第2个需要注意的问题,svnserve会产生许多子进程, 如果使用start-stop-daemon来关掉SVN时只指定PID文件,是不能把子进程一同关掉的。

do_stop()
{
    start-stop-daemon --stop --quiet --retry=TERM/30/KILL/5 --pidfile $PIDFILE --name $NAME
    RETVAL="$?"
    [ "$RETVAL" = 2 ] && return 2
    start-stop-daemon --stop --quiet --oknodo --retry=0/30/KILL/5 --exec $DAEMON
    [ "$?" = 2 ] && return 2
    rm -f $PIDFILE
    return "$RETVAL"
}

像上面那样,指定--exec $DAEMON参数,就会根据名称挨个去关掉。

 

下面是脚本的例子,

#! /bin/sh -e ### BEGIN INIT INFO # Provides: svnserve # Required-Start: $local_fs $syslog $remote_fs # Required-Stop: $local_fs $syslog $remote_fs # Default-Start: 2 3 4 5 # Default-Stop: 0 1 6 # Short-Description: Start/Stop svnserve ### END INIT INFO PATH=/sbin:/usr/sbin:/bin:/usr/bin DESC="svnserve" NAME=svnserve PIDFILE=/var/run/$NAME.pid DAEMON=/usr/bin/$NAME #why add --pid-file parameter here? svnserve writes correct PID into PIDFILE. #start-stop-daemon writes the PID before the process running. It may cause the PID nubmer dismatch. #So, Please DO NOT rely on the --make-pidfile option DAEMON_ARGS="-d -r /opt/svnproject --pid-file=$PIDFILE" SCRIPTNAME=/etc/init.d/$NAME [ -x "$DAEMON" ] || exit 0 [ -r /etc/default/$NAME ] && . /etc/default/$NAME . /lib/lsb/init-functions do_start() { start-stop-daemon --start --quiet --exec $DAEMON --test > /dev/null / || return 1 start-stop-daemon --start --quiet --background --exec $DAEMON -- / $DAEMON_ARGS / || return 2 } #For those prcesses with chilren processes. Please stop with --exec, plus command name. #--pid-file can only kill parent process. All the children processes will be transferred to 1. do_stop() { start-stop-daemon --stop --quiet --retry=TERM/30/KILL/5 --exec "$DAEMON" RETVAL="$?" [ "$RETVAL" = 2 ] && return 2 start-stop-daemon --stop --quiet --oknodo --retry=0/30/KILL/5 --exec "$DAEMON" [ "$?" = 2 ] && return 2 rm -f $PIDFILE return "$RETVAL" } case "$1" in start) log_daemon_msg "Starting $DESC" "$NAME" if [ -s $PIDFILE ] && kill -0 $(cat $PIDFILE) >/dev/null 2>&1; then log_daemon_msg "apparently already running" log_end_msg 0 exit 0 fi do_start case "$?" in 0|1) log_end_msg 0 ;; 2) log_end_msg 1 ;; esac ;; stop) log_daemon_msg "Stopping $DESC" "$NAME" do_stop case "$?" in 0|1) log_end_msg 0 ;; 2) log_end_msg 1 ;; esac ;; restart|force-reload) log_daemon_msg "Restarting $DESC" "$NAME" do_stop case "$?" in 0|1) do_start case "$?" in 0) log_end_msg 0 ;; 1) log_end_msg 1 ;; # Old process is still running *) log_end_msg 1 ;; # Failed to start esac ;; *) # Failed to stop log_end_msg 1 ;; esac ;; *) echo "Usage: $SCRIPTNAME {start|stop|restart|force-reload}" >&2 exit 3 ;; esac exit 0

 

 

 

你可能感兴趣的:(Linux)