Служба включается или отключается сама после установки пакета
Наборы предустановок (preset) определяют состояние автозапуска для служб при установке пакета. Именно поэтому одна служба после установки работает сразу, а другая нет — и это не случайность, а правило дистрибутива.
Вероятные причины
По порядку: сверху то, что встречается чаще.
-
Набор предустановок отключает службу
В части дистрибутивов правило по умолчанию — не включать новые службы. Пакет ставится, служба не работает, и это задумано.
-
Команда применения предустановок сбросила ваше включение
Команда
systemctl presetприводит состояние к правилам дистрибутива. Она может отключить то, что вы включали вручную.
Диагностика
Команды идут в том порядке, в котором их стоит выполнять: каждая следующая проверяет то, что осталось после предыдущей.
Действующие правила предустановок.
grep -r . /etc/systemd/system-preset/ /usr/lib/systemd/system-preset/ 2>/dev/null | head -20Текущее состояние автозапуска.
systemctl is-enabled myapp.serviceРешение
Решение своё для каждой причины. Сначала определите, какая из них ваша, — иначе правки наложатся друг на друга.
- Почему происходит
- В части дистрибутивов правило по умолчанию — не включать новые службы. Пакет ставится, служба не работает, и это задумано.
- Как проверить
-
Посмотрите правила предустановок для службы.
systemctl is-enabled myapp.service sudo systemctl preset myapp.service --dry-run 2>/dev/null || grep -r myapp /usr/lib/systemd/system-preset/ /etc/systemd/system-preset/ 2>/dev/null
- Как исправить
-
Включите службу явно:
systemctl enable --now. Переопределить правило для всех машин можно файлом в /etc/systemd/system-preset.
- Почему происходит
- Команда
systemctl presetприводит состояние к правилам дистрибутива. Она может отключить то, что вы включали вручную.
- Как проверить
-
Посмотрите, что изменилось, и текущее состояние.
systemctl is-enabled myapp.service journalctl -b --no-pager | grep -i preset | head
- Как исправить
- Задайте своё правило в /etc/systemd/system-preset: файлы оттуда имеют приоритет над дистрибутивными.
Пример вывода
Правило дистрибутива отключает новые службы. Пример показательный: он собран на тестовой машине специально для этой страницы, а не взят из чужого журнала.
$ cat /usr/lib/systemd/system-preset/90-systemd.preset | head -3
enable remote-fs.target
enable getty@.service
disable *
Связанные ошибки
- Unit … has no installation config: не включается автозапуск systemctl enable отказывает: в unit-файле нет секции [Install] или WantedBy. Как включить службу в автозапуск правильно.
- Unit is masked: служба запрещена к запуску Сообщение Unit is masked: unit заблокирован ссылкой на /dev/null. Как найти и снять маскировку.
- Автозапуск настроен ссылкой вручную Ссылка создана руками вместо systemctl enable: чем это отличается и когда ломается.
- WantedBy= в неверной секции: автозапуск не работает Параметр WantedBy= указан в [Unit] вместо [Install]. Служба запускается вручную, но не поднимается после перезагрузки.
- status=5/NOTINSTALLED и status=6/NOTCONFIGURED в systemd Коды 5 и 6 по соглашению LSB: программа не установлена или не настроена. Что это значит на практике и как проверить.
- Обновление не идёт: файл блокировки менеджера пакетов занят Установка отказывает: другой процесс держит блокировку. Чаще всего это служба автоматических обновлений.
- Обновление пакета отложено: программа запущена Обновление не применяется: механизм пакетов ждёт закрытия работающей программы. Как это выглядит у служб.
- Приложение Node.js не поднимается после перезагрузки Менеджер процессов запускает приложение вручную, но после перезагрузки его нет: сохранение списка и служба автозапуска.
Источники
-
systemd.preset(5)
Формат файлов предустановок и приоритет каталогов. -
Воспроизведено на тестовой машине, systemd 255 (Ubuntu 24.04)
Проверено на Ubuntu 24.04: правило «disable *» объясняет невключённые службы.