как запустить svnserve с помощью systemctl systemd

Пакет subversion в debian jessie не включает служебный файл 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.

что можно улучшить?


person user855443    schedule 05.07.2016    source источник
comment
Я голосую за то, чтобы закрыть этот вопрос как не по теме, потому что он не по теме для SO, поскольку он не имеет прямого отношения к программированию. Сайт Unix и Linux StackExchange подойдет лучше.   -  person Mark Stosberg    schedule 05.07.2016
comment
Файлы systemd практически одинаковы во всех дистрибутивах, основанных на systemd. Вы смотрели на эквивалентные файлы из Arch Linux, Fedora или Ubuntu для вдохновения?   -  person Mark Stosberg    schedule 05.07.2016
comment
В чем проблема с вашим текущим решением? Это не работает? Какую ошибку выдает?   -  person Marki555    schedule 14.07.2016


Ответы (5)


Вот предложение настроить службу svnserve в стиле Debian с выделенной учетной записью службы 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
}

Надеюсь это поможет.

person Yves Martin    schedule 14.11.2016
comment
@Yves Martin Спасибо за это решение. Недавно я использовал вариант этого решения и получил несколько комментариев. Во-первых, в /etc/default/svnserve флаг arg для файла журнала должен быть --log-file, а не --log. Кроме того, несмотря на то, что каталог журналов создается только один раз, сохранение /var/run не гарантируется. Лучше использовать директиву RuntimeDirectory=. В Ubuntu /var/run является символической ссылкой на /run. - person Grexis; 06.02.2017
comment
@Grexis Большое спасибо за ваши улучшения. Эта настройка службы выглядит великолепно сейчас. Я узнал еще одну особенность systemd и исправил свою FHS о /run. Спасибо - person Yves Martin; 08.02.2017
comment
Не нарушит ли это установленные соединения svn во время логротации? То есть, если я нахожусь в середине операции svn, скажем, длительной проверки на автоматизированном сборщике, не будет ли перезапуск прерывать и, таким образом, прерывать мое соединение svn и, следовательно, мою сборку? - person K Richard Pixley; 17.03.2017
comment
Хороший вопрос. Насколько я знаю, svnserve разветвляется для каждого запроса и ждет, пока ребенок остановится, прежде чем выйти... поэтому я думаю, что нет возможности отменить текущую операцию. - person Yves Martin; 17.03.2017
comment
Я вернул KillMode к control-group по умолчанию, иначе дочерние процессы останутся запущенными. ExecReload не дает ожидаемого эффекта, процесс просто убивается. - person Yves Martin; 20.06.2017
comment
Кажется, sudo mkdir -p /srv/svn/repos необходимо перед редактированием /etc/default/svnserve, если нет этого каталога, /srv/svn/repos. - person Zhilong Jia; 21.01.2019
comment
Я хотел бы обратить внимание на приведенный ниже ответ @Matt Hovey, который предлагает удалить строку псевдонима. Я тоже считаю, что наличие этой строки мешает работе команды systemctl enable (в Ubuntu 20.04). - person EricS; 28.05.2020
comment
Комбинация User=... + PIDFile=/run/... у меня не работала (на RHEL7), потому что пользователь svn не может писать в /run/.... Даже с подкаталогом, принадлежащим svn пользователю, этот подкаталог стирался. Я заставил это работать, отказавшись от файла PID и используя GuessMainPID=true. - person Possum; 07.08.2020
comment
RHEL очищает /run при загрузке, тогда как Debian этого не делает. Может быть интересно найти портативный способ записи PID-файла без полномочий root из службы systemd. - person Yves Martin; 14.09.2020

Обновление: мой ответ ниже устарел. Эти и другие улучшения были включены в отличное решение Yves Martin.

У меня есть два улучшения: обычно рекомендуется не запускать такие вещи как root. Создайте для этого пользователя, например 'svn'. Также рекомендуется явно указывать файл 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
person EricS    schedule 12.08.2016
comment
ФАЙЛ PID выглядит хорошей идеей, как и отдельный пользователь. спасибо! - person user855443; 30.10.2016
comment
Я изменил это, чтобы поместить файл pid в каталог, полностью управляемый пользователем svn, а не в /var/run/svnserve. /var/run был временным в системе, которую я использовал. Возможно, было бы лучше создать сценарий запуска и разрешить /var/run/svnserve, но я решил не заниматься этим. Возможно, кто-то еще может улучшить это. - person EricS; 11.11.2016
comment
@EricS У меня была такая же проблема. Для этого идеально подходит директива RuntimeDirectory=. tmpfiles.d для чего-то более сложного. - person Grexis; 06.02.2017

Один комментарий к превосходному ответу Ива Мартина выше (у меня пока нет очков репутации для комментариев):

При попытке включить службу для запуска при загрузке я получаю сообщение об ошибке:

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

Проведя некоторое исследование, я обнаружил, что вы, по-видимому, не можете установить псевдоним для того же имени, что и служба. Удаление строки Alias ​​из раздела [Install] 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
person Matt Hovey    schedule 23.06.2018
comment
Я считаю, что это верно и для Ubuntu 20.04. Однако при включении я получаю другую ошибку: Не удалось включить устройство: файл /etc/systemd/system/svnserve.service уже существует. Спасибо за это! - person EricS; 28.05.2020

Пожалуйста, рассмотрите эту замену 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

и [email protected]

[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
person vkersten    schedule 15.08.2019

(Я бы сделал это комментарием к @Yves Martin answer, но это новая учетная запись, и мне не разрешено прокомментировать. :-P )

В случае с SELinux это решение не допускает автозапуск демона. Я сделал несколько изменений, чтобы сделать его счастливым. У демона svnserve нет прав open в дереве /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 и каталог журналов правильными владельцами и типом безопасности:

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 является общим, и правила для этого дерева каталогов уже существуют, поэтому последние несколько строк выше не нужны.)

person S. Narum    schedule 27.02.2018
comment
Для опции добавления semanage требуется два символа «-», например: # sudo semanage fcontext --add --type svnserve_content_t /project/svn(/.*)? - person Mac; 19.09.2018
comment
Спасибо @Mac. Исправлена - person S. Narum; 23.09.2019