如何使用systemctl systemd启动svnserve

时间:2016-07-05 07:35:08

标签: svn systemd

debian jessie中的

subversion包不包含systemd服务文件。什么是最简单的自动启动解决方案。我试试

[Unit]
Description=Subversion protocol daemon
After=syslog.target network.target

[Service]
Type=forking
#EnvironmentFile=/etc/conf.d/svnserve
#ExecStart=/usr/bin/svnserve --daemon $SVNSERVE_ARGS
ExecStart=/usr/bin/svnserve -d -r /svnFolder/repositories
ExecReload=/bin/kill -HUP $MAINPID
KillMode=process
Restart=on-failure

[Install]
WantedBy=multi-user.target
Alias=svnserve.service

它是https://bbs.archlinux.org/viewtopic.php?id=190127的改编版,但我直接在这里直接为svnserve设置参数。

可以改进什么?

5 个答案:

答案 0 :(得分:23)

以下是设置svnserve服务" -Debian-way"使用具有适当日志记录的专用svn服务帐户运行。根据{{​​3}},存储库应存储在/srv/

首先,systemd /etc/systemd/system/svnserve.service的服务配置:

[Unit]
Description=Subversion protocol daemon
After=syslog.target network.target

[Service]
Type=forking
RuntimeDirectory=svnserve
PIDFile=/run/svnserve/svnserve.pid
EnvironmentFile=/etc/default/svnserve
ExecStart=/usr/bin/svnserve $DAEMON_ARGS
User=svn
Group=svn
KillMode=control-group
Restart=on-failure

[Install]
WantedBy=multi-user.target

其次,/etc/default/svnserve的服务启动选项:

# svnserve options
DAEMON_ARGS="--daemon --pid-file /run/svnserve/svnserve.pid --root /srv/svn/repos --log-file /var/log/svnserve/svnserve.log"

要正常工作,必须使用适当的所有权创建日志文件的文件夹:

mkdir /var/log/svnserve; chown svn /var/log/svnserve

以日志轮换配置结束/etc/logrotate.d/svnserve

/var/log/svnserve/*.log {
    daily
    missingok
    rotate 14
    compress
    notifempty
    create 640 svn adm
    sharedscripts
    postrotate
            if /bin/systemctl status svnserve > /dev/null ; then \
                /bin/systemctl restart svnserve > /dev/null; \
            fi;
    endscript
}

希望这有帮助。

答案 1 :(得分:2)

更新: 我的答案已经过时了。这些改进和其他改进已纳入Yves Martin's excellent solution

我有两个改进:通常建议不要运行root这样的东西。为此创建一个用户,例如'svn'。使用分叉时显式指定PID文件也是recommended。我的svnserve.service看起来很像你的,除了我添加行:

User=svn
Group=svn
PIDFile=/usr/local/svn/svnserve.pid
ExecStart=/usr/bin/svnserve  -d -r /usr/local/svn/repos --pid-file /usr/local/svn/svnserve.pid

答案 2 :(得分:1)

对上述伊夫·马丁(Yves Martin)出色的回答发表评论(我尚无评论要点):

尝试使服务在启动时启动时,我会收到错误消息:

$ sudo systemctl enable svnserve.service
Failed to execute operation: Invalid argument

进行一些研究后,我发现您显然无法将别名设置为与服务相同的名称。从svnserve.service的[Install]部分删除Alias行解决了该问题:

[Unit]
Description=Subversion protocol daemon
After=syslog.target network.target

[Service]
Type=forking
RuntimeDirectory=svnserve
PIDFile=/run/svnserve/svnserve.pid
EnvironmentFile=/etc/default/svnserve
ExecStart=/usr/bin/svnserve $DAEMON_ARGS
User=svn
Group=svn
KillMode=control-group
Restart=on-failure

[Install]
WantedBy=multi-user.target

答案 3 :(得分:0)

(我在@Yves Martin's answer上对此进行了评论,但这是一个新帐户,我不允许发表评论。:-P)

使用SELinux,此解决方案不允许守护程序的自动启动。我做了一些改变让它快乐。 svnserve守护程序在/ var / log树中没有 open 权限。将日志放在svn帐户的域中可以解决安全问题。

在/etc/systemd/system/svnserve.service:

<r>$b</r>

在/etc/logrotate.d/svnserve中:

<r>$d</r>

最后,使svn repos和log目录具有正确的所有权和安全类型:

ExecStart=/usr/bin/svnserve --daemon \
  --pid-file /var/run/svnserve/svnserve.pid \
  --root /project/svn/repos \
  --log-file /project/svn/log/svnserve.log

(显然,将/ project / svn更改为你决定放置repo结构的地方./ var / svn很常见,并且该目录树的规则已经存在,使上面的几行不再必要。)

答案 4 :(得分:0)

请考虑用此替代xinet-> systemd: (主要是从http://0pointer.de/blog/projects/inetd.html

收集的

您需要创建两个文件:

svnserve.socket

[Unit]
Description=SVN Socket for Per-Connection Servers

[Socket]
ListenStream=3690
Accept=yes

[Install]
WantedBy=sockets.target

和 svnserve @ .service

[Unit]
Description=SVN Per-Connection Server

[Service]
User=svn
Group=svn
ExecStart=-/usr/bin/svnserve -i -r /srv/repositories/svn/repositories
StandardInput=socket

将两个文件都复制到/ etc / systemd / system /

然后

systemctl enable svnserve.socket
systemctl start svnserve.socket
systemctl status svnserve.socket