提醒:本页面将不再更新、维护或者支持,文章、评论所叙述内容存在时效性,涉及技术细节或者软件使用方面不保证能够完全有效可操作,请谨慎参考!

前面两篇文章简单的介绍了SVN的使用,其中讲到了如何通过svnserve直接启动SVN服务,但是每次都使用 svnserve -d -r ~/repos 这样的命令还是略显麻烦,尤其是当我们需要停止或者重启svnserve时还要调用kill命令,十分不便,接下来介绍的是如何将其作为系统服务,让其可以被Debian的invoke-rc.d命令管理。

说是系统服务,说白了就是我们需要启动脚本,大家可以到 /etc/init.d 路径下看到一堆启动脚本,比如有我们熟悉的nginx,有了初始脚本(initscript)我们就可以通过update-rc.d创建文件链接的方式将其链入启动级别(runlevel)中去了,同样也可以被invoke-rc.d管理。

你可以随意查阅 /etc/init.d 路径下的某些程序的脚本文件,大体上能知道这类文件的写法,当然今天我不是介绍initscript的写法的,更何况网上已经有现成的脚本可用了,参考文章 《running Subversion's svnserve on a Debian system》 ,我将其脚本修改如下:

#!/bin/sh

### BEGIN INIT INFO
# Provides:          subversion
# 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 subversion daemon
# Description:       starts subversion using start-stop-daemon
### END INIT INFO
 
# sudo svnserve -d -r /home/pi/repos
# http://www.everville.de/pages/howtos/linux/svnserve/index.html

# start/stop subversion daemon

test -f /usr/bin/svnserve || exit 0

# 这里是svnserve执行的参数,/home/pi/repos改为你自己的版本库地址
OPTIONS="-d -T -r /home/pi/repos"

case "$1" in
	start)
		echo -n "Starting subversion daemon:"
		echo -n " svnserve"
		# 这里的pi:pi为member:group,即用户:组名,改为适合你自己的
		start-stop-daemon --start --quiet --oknodo --chuid pi:pi --exec /usr/bin/svnserve -- $OPTIONS
		echo "."
    	;;

	stop)
		echo -n "Stopping subversion daemon:"
		echo -n " svnserve"
		start-stop-daemon --stop --quiet --oknodo --exec /usr/bin/svnserve
		echo "."
		;;

	reload)
		;;

	force-reload)
	$0 restart
		;;

	restart)
	$0 stop
	$0 start
		;;

	*)
		echo "Usage: /etc/init.d/subversion (start|stop|reload|restart)"
		exit 1
		;;

esac

exit 0

大家可能注意到了BEGIN INIT INFO这样的信息,这其实是LSB信息,里面标识着这个服务运行的参数,当然在Debian 5及以下版本的系统中可以略去,但是在Debian 6及最新系统中会提示missing LSB information的错误信息,LSB信息是可以被服务加载器读取的,建议大家在不明白的情况下不要变动。

将上面的脚本按注释提示修改后保存为subversion文件,路径为 /etc/init.d ,添加执行属性:

chmod +x /etc/init.d/subversion

添加启动项:

update-rc.d /etc/init.d/subversion defaults

当然这个方法可能在Debian 6及高版本的Debian下不再适用,不过通过LSB信息,我们可以直接使用insserv命令来安装服务。

insserv -v -d /etc/init.d/subversion