Systemd останавливает другую службу при запуске одной из них

Вы можете сделать что-то вроде:

perl -pe 's/^[\w.]+(?==)|\$\{[\w.]+\}/$& =~ y|.|_|r/ge' < file

То есть заменить .на _в последовательностях словесных символов или ., которые находятся в начале строки, за которыми следует =или внутри ${...}.

Флаг rдля оператора y///(, чтобы результат подстановки возвращался вместо применения к переменной ), требует perl 5.14 или выше. В более старых версиях вы всегда можете сделать:

perl -pe 's/^[\w.]+(?==)|\$\{[\w.]+\}/$_ = $&; y|.|_|; $_/ge' < file

Теперь, для вашей конечной задачи, так же легко сделать все это в perlздесь, а не интерпретировать код в оболочке, что было бы довольно опасно:

 perl -lne '
    s/\$\{([\w.]+)\}/$v{$1}/g;
    if (/^([\w.]+)=(.*)/) {
      $v{$1} = $v = $2;
      print $v if $1 =~ /_url$/
    }' < file > separate-file
2
29.07.2020, 07:47
1 ответ

Изsystemd.unit(5):

Conflicts=

A space-separated list of unit names. Configures negative requirement dependencies. If a unit has a Conflicts= setting on another unit, starting the former will stop the latter and vice versa.

Note that this setting does not imply an ordering dependency, similarly to the Wants= and Requires= dependencies described above. This means that to ensure that the conflicting unit is stopped before the other unit is started, an After= or Before= dependency must be declared. It doesn't matter which of the two ordering dependencies is used, because stop jobs are always ordered before start jobs, see the discussion in Before=/After= below.

If unit A that conflicts with unit B is scheduled to be started at the same time as B, the transaction will either fail (in case both are required parts of the transaction) or be modified to be fixed (in case one or both jobs are not a required part of the transaction). In the latter case, the job that is not required will be removed, or in case both are not required, the unit that conflicts will be started and the unit that is conflicted is stopped.

Итак, если вы хотите убить Bи Cпри каждом запуске A, просто добавьте это в раздел [Unit]в A.service

.
[Unit]
Conflicts=B.service C.service

Если вы сделаете все три устройства Conflict=друг с другом, то вы сами выберете, какое из них вы хотите запустить. Таким образом, запуск A убьет B&C, запуск B убьет A&C, а запуск C убьет A&B.

Похоже, вы хотите, чтобы B.serviceработало по умолчанию, поэтому только у него должна быть связь WantedBy=multi-user.target. Не добавляйте это к другим (или не включайте их ), иначе все они попытаются запуститься при загрузке, и все они либо потерпят неудачу, либо случайный останется запущенным.

Похоже, вы хотите, чтобы B.serviceзапускалось всякий раз, когда вы останавливаете A.serviceили C.service. Старайтесь больше думать о том, чего вы хотите, а не о том, чего вы не хотите.Systemd не имеет отношения, которое запускает один модуль при выключении другого. Чтобы выключить всю систему, systemd вызывает shutdown.target, который конфликтует со всем, что приводит к их отключению. Представьте, что C перестает выключаться, запуская B во время процедуры выключения.

4
18.03.2021, 23:16

Теги

Похожие вопросы