как запустить 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 прямо здесь.

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

 Mark Stosberg05 июл. 2016 г., 15:08
Файлы systemd в основном одинаковы во всех дистрибутивах, основанных на systemd. Вы смотрели на эквивалентные файлы из Arch Linux, Fedora или Ubuntu для вдохновения?
 Marki55514 июл. 2016 г., 12:46
В чем проблема с вашим текущим решением? Это не работает? Какую ошибку это выдает?
 Mark Stosberg05 июл. 2016 г., 15:07
Я голосую, чтобы закрыть этот вопрос как не по теме, потому что это не по теме для SO, так как он не имеет прямого отношения к программированию. Подойдет сайт Unix и Linux StackExchange.

Ответы на вопрос(4)

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

У меня есть два улучшения: обычно рекомендуется не запускать такие вещи, как 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
 user85544330 окт. 2016 г., 09:41
PID ФАЙЛ выглядит как хорошая идея, как и отдельный пользователь. благодарю вас!
 EricS11 нояб. 2016 г., 02:54
Я изменил это, чтобы поместить файл pid в каталог, полностью управляемый пользователем svn, а не / var / run / svnserve. / var / run был временным в системе, которую я использовал. Возможно, было бы лучше создать сценарий запуска и разрешить / var / run / svnserve, но я решил не иметь с этим дело. Возможно, кто-то еще может улучшить это.
 Grexis06 февр. 2017 г., 09:12
@EricS У меня была такая же проблема.RuntimeDirectory= Директива идеально подходит для этого, и естьtmpfiles.d для чего-то более сложного.

@ Ив Мартин ответ, но это новый аккаунт, и я не могу комментировать. :-П )

В SELinux это решение не допускает автозапуска демона. Я сделал несколько изменений, чтобы сделать его счастливым. У демона svnserve нетоткрыть права в / var / log tree. Размещение журнала в домене учетной записи 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 является общим, и правила для этого дерева каталогов уже существуют, что делает ненужными последние пару строк выше.)

 Mac19 сент. 2018 г., 21:33
Для опции добавления semanage требуется два символа '-', например: # sudo semanage fcontext --add --type svnserve_content_t "/project/svn(/.*)?"

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

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

$ 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

Вот предложение по настройкеsvnserve сервис "the-Debian-way" работает с выделеннымsvn учетная запись службы с правильной регистрации. В соответствии сFHSрепозитории должны храниться в/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
}

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

 Zhilong Jia21 янв. 2019 г., 15:39
Похоже на тоsudo mkdir -p /srv/svn/repos необходимо перед редактированием/etc/default/svnserve если этого нет,/srv/svn/repos.
 Yves Martin17 мар. 2017 г., 19:02
Хороший вопрос. Насколько я знаю,svnserve разветвляется на каждый запрос и ждет, пока ребенок остановится перед выходом ... так что я думаю, что нет никакой возможности отменить выполняемую операцию
 K Richard Pixley17 мар. 2017 г., 18:30
Не нарушит ли это выдающиеся svn-соединения во время входа? То есть, если я нахожусь в середине операции svn, скажем, над длительной проверкой на автоматическом сборщике, не будет ли прерывание «перезапуска» и, таким образом, разорвано мое соединение svn и, следовательно, моя сборка?
 Yves Martin20 июн. 2017 г., 12:48
Я вернулсяKillMode по умолчаниюcontrol-group или же дочерние процессы остаются запущенными.ExecReload не имеет ожидаемого эффекта, процесс просто убит.
 Grexis06 февр. 2017 г., 09:08
@ Yves Martin Спасибо за это решение. Недавно я использовал вариант этого решения и получил несколько комментариев. Во-первых, в/etc/default/svnserveфлаг arg для файла журнала должен быть--log-fileне--log, Кроме того, при создании каталога журнала необходимо выполнить только один раз,/var/run не гарантируется сохраняться. Было бы лучше использоватьRuntimeDirectory= директивы. В Ubuntu/var/run символическая ссылка на/run.
 Yves Martin08 февр. 2017 г., 11:57
@Grexis Большое спасибо за ваши улучшения. Эта настройка сервиса теперь выглядит великолепно. Я узнал еще одну особенностьsystemd и исправить мой FHS о/run, Спасибо

Ваш ответ на вопрос