Назад | Перейти на главную страницу

systemd запускает службу, даже если служба требует, не запускается

У меня есть тестовая служба systemd, которую я тестирую. У меня есть test.service, который выглядит так

[Unit]
Description=Dovid Demo Service
After=mariadb.service
Requires=mariadb.service

[Service]
ExecStart=/home/dovid/test.sh
User=dovid
Group=dovid

[Install]
WantedBy=default.target

Если я сделаю

systemctl start test

Сначала он запустит MariaDB, а затем запустит мой скрипт. Однако, если у меня есть MariaDB в маске (я сделал маску systemctl mariadb), тогда MariaDB не запустится, а systemd запустит test.sh. Разве это не должно произойти из-за запуска необходимого процесса, которым в данном случае является MariaDB?

Это ошибка в systemd. Я отправил отчет об ошибке и проанализировал, что здесь не так: https://github.com/systemd/systemd/issues/11338

Эта проблема проявляется здесь, когда цель получает Хочет = юнит, который требует = замаскированный юнит. Транзакция построена, и systemd уже добавил задание для модуля привязки, его зависимость Wants =, и не удаляет ее, когда в вашем случае получает -ERFKILL, и распространение этого до функции, вызываемой для UNIT_WANTS, игнорирует ее (поскольку она не является фатальной ошибкой), поэтому вы в конечном итоге запускаете устройство, даже если требуемый модуль замаскирован.

Это происходит во многих других случаях, например, RequiresMountsFor = для несуществующих путей и т. Д. То же самое и для BindsTo =.

Обход снизу вверх - это то, с чем я играл, но это приводит к другой проблеме: если какой-то модуль Requires = existing.service non-existent.service, он все равно будет ставить в очередь ложное задание, поэтому это добавление заданий должно быть атомарный на каком-то уровне. Более того, он не может поставить в очередь ложное задание, в зависимости от того, в каком порядке вы указываете вещи.

В любом случае, подумайте о том, чтобы решить эту проблему с GitHub и объяснить, как вы ее решаете.