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设置参数。
可以改进什么?
答案 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