У меня есть тестовая служба 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 и объяснить, как вы ее решаете.