簡體   English   中英

如何使用 systemctl systemd 啟動 svnserve

[英]how to start svnserve with systemctl 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 直接放在這里。

什么可以改進?

這是設置svnserve服務“the-Debian-way”的建議,該服務使用具有適當日志記錄的專用svn服務帳戶運行。 根據FHS ,存儲庫應存儲在/srv/

mkdir -p /srv/svn/repos; chown svn /srv/svn/repos

首先是 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"

為了正常工作,日志文件的文件夾也必須以正確的所有權和運行位置為 pid 文件創建:

mkdir /var/log/svnserve; chown svn /var/log/svnserve
mkdir -p /run/svnserve; chown svn /run/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
}

希望這會有所幫助。

更新:我下面的答案已過時。 這些改進和其他改進已融入Yves Martin 的出色解決方案中

我有兩個改進:一般建議不要運行 root 之類的東西。 為此創建一個用戶,例如“svn”。 建議在使用 fork 時顯式指定 PID 文件。 我的 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

對上面 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

(我會對@Yves Martin 的回答發表評論,但這是一個新帳戶,我不允許發表評論。:-P)

對於 SELinux,此解決方案不允許守護進程自動啟動。 我做了一些改變,讓它開心。 svnserve 守護進程在 /var/log 樹中沒有打開權限。 將日志放在 svn 帳戶的域中可以解決安全問題。

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

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

在 /etc/logrotate.d/svnserve 中:

/project/svn/log/*.log {  # path changed
...
  create 644 svn svn   # corrected group and made world-readable
...

最后,使 svn repos 和 log 目錄具有正確的所有權和安全類型:

sudo mkdir /project/svn
sudo chmod 755 /project/svn
sudo mkdir /project/svn/repos /project/svn/log
sudo chown -R svn:svn /project/svn
sudo semanage fcontext --add --type svnserve_content_t "/project/svn(/.*)?"
sudo restorecon -Rv /project/svn

(顯然,將 /project/svn 更改為您決定放置存儲庫結構的任何位置。/var/svn 很常見,並且該目錄樹的規則已經存在,因此不需要上面的最后幾行。)

請考慮替換 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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM