Две службы конфликтуют: Conflicts= и взаимная остановка
Параметр Conflicts= объявляет, что две службы не могут работать одновременно: запуск одной останавливает другую. Это нужно для взаимоисключающих вещей вроде двух веб-серверов на одном порту, но неожиданно, если параметр оказался в файле случайно.
Вероятные причины
По порядку: сверху то, что встречается чаще.
-
Конфликт объявлен намеренно пакетом
Пакеты взаимоисключающих служб объявляют конфликт, чтобы не было борьбы за порт. Запуск одной честно останавливает другую.
-
Конфликт с целью выключения
Все службы неявно конфликтуют с целью выключения. Это нормально и означает лишь порядок остановки.
-
Конфликт добавлен в собственный unit-файл по недоразумению
Параметр иногда путают с зависимостями. В результате запуск службы неожиданно останавливает другую.
Диагностика
Команды идут в том порядке, в котором их стоит выполнять: каждая следующая проверяет то, что осталось после предыдущей.
Конфликты в обе стороны.
systemctl show myapp.service -p Conflicts -p ConflictedByКто кого остановил при загрузке.
journalctl -b --no-pager | grep -iE "stopping.*due to|conflicts with" | headРешение
Решение своё для каждой причины. Сначала определите, какая из них ваша, — иначе правки наложатся друг на друга.
- Почему происходит
- Пакеты взаимоисключающих служб объявляют конфликт, чтобы не было борьбы за порт. Запуск одной честно останавливает другую.
- Как проверить
-
Посмотрите объявленные конфликты.
systemctl show nginx -p Conflicts systemctl show apache2 -p Conflicts 2>/dev/null
- Как исправить
- Выберите одну службу. Если нужны обе, разведите их по портам и уберите конфликт через переопределение.
- Почему происходит
- Все службы неявно конфликтуют с целью выключения. Это нормально и означает лишь порядок остановки.
- Как проверить
-
Посмотрите полный список конфликтов.
systemctl show myapp.service -p Conflicts
- Как исправить
- Ничего делать не нужно: конфликт с целью выключения есть у всех.
- Почему происходит
- Параметр иногда путают с зависимостями. В результате запуск службы неожиданно останавливает другую.
- Как проверить
-
Посмотрите свои unit-файлы на наличие параметра.
grep -rn "^Conflicts" /etc/systemd/system/*.service 2>/dev/null
- Как исправить
-
Уберите параметр, если взаимоисключения нет. Для порядка запуска нужны
After=иBefore=.
Пример вывода
Запуск nginx остановил apache. Пример показательный: он собран на тестовой машине специально для этой страницы, а не взят из чужого журнала.
systemd[1]: Stopping apache2.service - The Apache HTTP Server...
systemd[1]: apache2.service: Deactivated successfully.
systemd[1]: Stopped apache2.service - The Apache HTTP Server.
systemd[1]: Started nginx.service - A high performance web server.
$ systemctl show nginx.service -p Conflicts
Conflicts=apache2.service shutdown.target
Связанные ошибки
- Address already in use при запуске службы Порт или адрес уже занят: bind() failed (98: Address already in use). Как найти владельца порта и что делать с остатками прежнего процесса.
- Служба останавливается сама: StopWhenUnneeded Служба выключается, когда её перестают требовать. Разбор параметра StopWhenUnneeded и связки BindsTo.
- Unit is masked: служба запрещена к запуску Сообщение Unit is masked: unit заблокирован ссылкой на /dev/null. Как найти и снять маскировку.
- Operation refused, unit may be requested by dependency only systemd отказывается запускать unit вручную из-за RefuseManualStart=yes. Что это значит и как запустить службу правильно.
- Apache: Invalid command — не включён модуль Apache не запускается: директива требует модуль, который не подключён. Как найти нужный модуль и включить.
- Apache: правила .htaccess не действуют Файл .htaccess игнорируется: запрещён параметром AllowOverride, нет нужного модуля, файл не читается.
- Configuration file is marked world-inaccessible Предупреждение о правах на unit-файл: служба работает, но файл недоступен для чтения другим.
- Connection refused в журнале службы Соединение отклонено: служба не может подключиться к базе, кешу или другому сервису. Порядок запуска, адрес, брандмауэр.
Где встречается чаще всего
Источники
-
systemd.unit(5)
Conflicts= и неявные конфликты с целью выключения. -
Воспроизведено на тестовой машине, systemd 255 (Ubuntu 24.04)
Проверено на nginx и apache2 из пакетов Ubuntu.