LINUX.ORG.RU
ФорумAdmin

Приостановить systemd сервис на время бэкапа.

 


0

1

Имеется сервис, запущенный systemd-юнитом. Периодически по таймеру надо запускать другой сервис, который бэкапит данные. При этом, основной сервис,если запущен, надо остановить, а по окончании бэкапа, запустить. С таймером все понятно, как запустить основной сервис после бэкапа? Сервис бэкапа должен запускаться не от рута, а от отдельного юзера.


Ответ на: комментарий от intelfx

Напиши polkit-правило.

Зачем? Мне просто нужно указать зависимость - запустить основной сервис, после того как отработает сервис бэкапа.

chuzhoi
() автор топика
Ответ на: комментарий от chuzhoi

Мне просто нужно указать зависимость - запустить основной сервис, после того как отработает сервис бэкапа.

Таких зависимостей в systemd нет.

Ты можешь сколхозить что-нибудь на Before=/After= и вспомогательных юнитах, но такая конструкция развалится по первому чиху.

intelfx ★★★★★
()

официально костыль в виде
ExecStartPre=/path/another_service pause
….
ExecStartPost=/path/another_service resume
в бекап сервисе

либо
ExecStartPre=/bin/systemctl stop another_service
….
ExecStartPost=/bin/systemctl start another_service
если прога не умеет в паузу вставать.

pfg ★★★★★
()

Создаёшь таргет, в котором 1 сервис выключен, 2 включен, и переключаешь таргет то на него, то обратно на дефолт. По ману так. Примерно так же можно бэкапить / на lvm через снепшот, создаваемый до его монтирования при загрузке, удобно.

anonymous
()

Добавь в кронтаб скрипт::

systemctl stop servicename do_backup systemctl start servicename

anonymous
()
Ответ на: комментарий от pfg

Примерно такое и сколхозил. Весь секас был в том, что если указать

User=non_root

то не только ExecStart, но и все остальное будет запускаться от нерута, и, соответственно, обламываться.

Вообще конечно странно, что systemd навертели столько опций, но нет элементарного функционала, необходимого для таких простых вещей, как бэкап.

chuzhoi
() автор топика
Ответ на: комментарий от chuzhoi

Примерно такое и сколхозил. Весь секас был в том, что если указать

User=non_root

то не только ExecStart, но и все остальное будет запускаться от нерута, и, соответственно, обламываться.

Там можно в Exec*= сразу после знака равенства написать +. Это заставит systemd запускать данный бинарник от рута, без ограничений прав.

Вообще конечно странно, что systemd навертели столько опций, но нет элементарного функционала, необходимого для таких простых вещей, как бэкап.

«Необходимость» ты сам выдумал. Я тоже раньше упарывался конструированием пирамидок из юнитов, но по факту это колхоз. Высокоуровневую логику нужно описывать в отдельном скрипте, а не пытаться упихать её в юниты и зависимости. Это не Тьюринг-машина и ей никогда не будет.

intelfx ★★★★★
()
Последнее исправление: intelfx (всего исправлений: 1)
Ответ на: комментарий от intelfx

Высокоуровневую логику нужно описывать в отдельном скрипте

это ты щас ненавистную «баш лапшу» предлагаешь? ;)

leave ★★★★★
()
Ответ на: комментарий от leave

А я никогда не говорил, что она ненавистная, не нужно приписывать мне чьи-то заблуждения.

intelfx ★★★★★
()
Последнее исправление: intelfx (всего исправлений: 1)
Ответ на: комментарий от leave

требуй сразу юнит на языке функциональном языке :) чтобы сразу и фсё.
даёшь nixsystemd !!

pfg ★★★★★
()

ты можешь написать скрипт на питоне/баше и по крону запускать. проверяешь процесс, если запущен основной (тот который нужен) если запущен убиваешь процесс или же не запускаешь сервис, когда закончится основной сервис запускаешь второй от нужного тебе юзера.

robocat
()
Ответ на: комментарий от chuzhoi

User=non_root

то не только ExecStart, но и все остальное будет запускаться от нерута, и, соответственно, обламываться.

man systemd.service

       PermissionsStartOnly=
           Takes a boolean argument. If true, the permission-related execution options, as configured with User= and similar options (see systemd.exec(5) for more information), are only applied to the process started with ExecStart=, and not to the various other ExecStartPre=, ExecStartPost=, ExecReload=, ExecStop=, and ExecStopPost= commands. If false, the setting is applied to all configured commands the same way. Defaults to false.
spirit ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.