Transaction for … is destructive
Сообщение о разрушительной транзакции означает, что запрошенная операция потребовала бы остановки unit, которые останавливать нельзя. systemd отказывается целиком, вместо того чтобы сделать половину работы.
Вероятные причины
По порядку: сверху то, что встречается чаще.
-
Операция конфликтует с работающими unit
Запуск цели или изоляция состояния требует остановки того, что сейчас работает и помечено как неостановимое.
-
Изоляция цели на работающей системе
Команда изоляции останавливает всё, что не входит в цель. На рабочем сервере это почти всегда не то, чего вы хотели.
-
Unit защищён от остановки
Параметр запрета ручной остановки или жёсткие связи делают unit неостановимым в рамках транзакции.
Диагностика
Команды идут в том порядке, в котором их стоит выполнять: каждая следующая проверяет то, что осталось после предыдущей.
Текущие задания: транзакция могла столкнуться с ними.
systemctl list-jobsСообщения о конфликтах транзакций.
journalctl -b --no-pager | grep -iE "destructive|conflicting" | tail -10Решение
Решение своё для каждой причины. Сначала определите, какая из них ваша, — иначе правки наложатся друг на друга.
- Почему происходит
- Запуск цели или изоляция состояния требует остановки того, что сейчас работает и помечено как неостановимое.
- Как проверить
-
Посмотрите, что мешает.
systemctl list-jobs journalctl -b --no-pager | grep -i destructive | tail -5
- Как исправить
- Выполняйте операцию точнее: запускайте нужные unit по одному вместо изоляции цели.
- Почему происходит
- Команда изоляции останавливает всё, что не входит в цель. На рабочем сервере это почти всегда не то, чего вы хотели.
- Как проверить
-
Посмотрите, что входит в цель.
systemctl list-dependencies имя.target --no-pager | head -20
- Как исправить
- Вместо изоляции используйте обычный запуск цели или переключение цели по умолчанию с перезагрузкой.
- Почему происходит
- Параметр запрета ручной остановки или жёсткие связи делают unit неостановимым в рамках транзакции.
- Как проверить
-
Посмотрите параметры защиты.
systemctl show имя.service -p RefuseManualStop -p BindsTo
- Как исправить
- Снимите защиту осознанно или выполните операцию так, чтобы этот unit не затрагивался.
Пример вывода
Изоляция цели отклонена как разрушительная. Пример показательный: он собран на тестовой машине специально для этой страницы, а не взят из чужого журнала.
$ sudo systemctl isolate rescue.target
Failed to isolate rescue.target: Transaction for rescue.target/start is destructive (multi-user.target has 'stop' job queued, but 'start' is included in transaction).
Связанные ошибки
- Operation refused, unit may be requested by dependency only systemd отказывается запускать unit вручную из-за RefuseManualStart=yes. Что это значит и как запустить службу правильно.
- Dependency failed for … и результат 'dependency' Сообщение Dependency failed for: служба не запускалась, потому что упала её зависимость. Как найти настоящего виновника.
- Система загружается не в то состояние После загрузки нет служб или нет графики: цель по умолчанию указывает не туда. Как посмотреть и переключить.
- Connection refused в журнале службы Соединение отклонено: служба не может подключиться к базе, кешу или другому сервису. Порядок запуска, адрес, брандмауэр.
- Docker: демон не запускается без containerd docker.service падает, потому что не работает containerd.service. Разбор зависимости и сокета containerd.
- Found ordering cycle: циклическая зависимость при загрузке systemd нашёл цикл в порядке запуска и разорвал его, отбросив одну зависимость. Как найти цикл и правильно расставить After и Requires.
- Job for … failed because a fatal signal was delivered или canceled Задание отменено: его перекрыла другая операция или пришёл сигнал. Когда это нормально, а когда нет.
- Две службы конфликтуют: Conflicts= и взаимная остановка Запуск одной службы останавливает другую: параметр Conflicts=. Когда это полезно и когда мешает.
Источники
-
systemctl(1)
Команда isolate и транзакции заданий. -
Воспроизведено на тестовой машине, systemd 255 (Ubuntu 24.04)
Воспроизведено попыткой изоляции цели восстановления на работающей системе.