удалить службы systemd, которые не найдены

Вопрос или проблема

На моем сервере отображаются несколько отсутствующих служб. Как я могу удалить их из Systemd? Они значатся как not-found.

systemctl -a показывает: несколько not found
systemctl reset-failed показывает: все еще отображаются

Эти (ни одна из них не находится в /etc/systemd/ или /lib/systemd):

exim4.service – я использую postfix, никогда не устанавливал
apache2.service – я использую nginx

Спасибо!

systemd пытается загрузить все службы, которые указаны в Wants=, Requires=, After=, Before=, RequiresMountsFor=, Conflicts=, Requisite=, PartOf=, …, x-systemd.requires=, x-systemd.requires-mounts-for=, systemd.unit=, SYSTEMD_WANTS= и также ссылаются в .wants и .requires, и возможно в других местах, о которых я забыл.

Единицы, которые вы видите, должны быть указаны где-то. Systemd ничего не знает об apache2 или exim4 сам по себе. Учтите, что systemd будет создавать “обертки” для скриптов sysvinit.

Наличие этих служб в выводе systemctl --all безвредно. Нет необходимости их “удалять”.

Согласно отличному ответу zbyszek, я создал небольшой удобный скрипт systemctl-list-not-found-rdeps для поиска обратных зависимостей:

#!/bin/sh -e
# Для каждой единицы в состоянии not-found выводит файлы единиц, определяющие отношения к ней

COLOR_CYAN=$(tput setaf 6)
COLOR_GREEN=$(tput setaf 2)
COLOR_YELLOW=$(tput setaf 3)
COLOR_OFF=$(tput sgr0)

UNITS=$(systemctl list-units --state=not-found --quiet --plain | cut -f1 -d\ )

for UNIT in ${UNITS}
do
  RDEPS="$(systemctl show "${UNIT}" | grep -E '(After|Before|For|Of|By)=')" \
    || { echo "${UNIT} rdep not found"; exit 1; }
  echo "${RDEPS}" \
    | sed -r "s/(.*)=(.*)/${COLOR_GREEN}\1 ${COLOR_YELLOW}\2${COLOR_OFF}/" \
    | xargs -rI{} printf "${COLOR_CYAN}${UNIT}${COLOR_OFF} %s\n" '{}'
  echo
done

Ответ или решение

Если вы заметили, что на вашем сервере отображаются несколько сервисов в состоянии "not-found" при выполнении команды systemctl -a, это может вызвать вопросы о том, как безопасно удалить эти ссылки в Systemd. В большинстве случаев такие сервисы не оказывают значительного влияния на работу системы, но если вы хотите очистить список от ненужных или устаревших записей, следуйте указаниям ниже.

Шаг 1: Анализ причин

Первое, на что стоит обратить внимание — это то, что systemd может пытаться загрузить сервисы, упомянутые в указаниях таких как Wants=, Requires=, After=, Before=, и других подобного рода. Убедитесь, что ненужные ссылки не сохранены в конфигурационных файлах других активных сервисов, которые могут помимо воли порождать эти "not-found" состояния.

Шаг 2: Поиск зависимостей

Для нахождения реверсных зависимостей можно использовать скрипт systemctl-list-not-found-rdeps, который поможет определить, откуда именно формируется упоминание о несуществующем сервисе. Скрипт выводит элегантно отформатированный список зависимостей:

#!/bin/sh -e
# Для каждого не найденного юнита показывать файлы юнитов, определяющие связи с ним

COLOR_CYAN=$(tput setaf 6)
COLOR_GREEN=$(tput setaf 2)
COLOR_YELLOW=$(tput setaf 3)
COLOR_OFF=$(tput sgr0)

UNITS=$(systemctl list-units --state=not-found --quiet --plain | cut -f1 -d\ )

for UNIT in ${UNITS}
do
  RDEPS="$(systemctl show "${UNIT}" | grep -E '(After|Before|For|Of|By)=')" \
    || { echo "${UNIT} rdep not found"; exit 1; }
  echo "${RDEPS}" \
    | sed -r "s/(.*)=(.*)/${COLOR_GREEN}\1 ${COLOR_YELLOW}\2${COLOR_OFF}/" \
    | xargs -rI{} printf "${COLOR_CYAN}${UNIT}${COLOR_OFF} %s\n" '{}'
  echo
done

Шаг 3: Устранение неполадок и очистка

  1. Редактирование конфигураций: Найдите и откройте конфигурационные файлы сервисов, где могут упоминаться удалённые сервисы, такие как exim4.service и apache2.service, и удалите или исправьте эти записи.

  2. Удаление symlink’ов: Даже если юниты не присутствуют в /etc/systemd/ или /lib/systemd/, необходима проверка в директориях .wants и .requires, чтобы удостовериться, что там нет ссылок на несуществующие сервисы.

  3. Проверка и перезапуск: После всех изменений перезапустите systemd-daemon с помощью команды systemctl daemon-reload, чтобы применить изменения.

Хотя присутствие не найденных сервисов в списках systemctl в целом безвредно, удаление их может помочь в поддержании порядка и облегчить управление сервером. Если вы уверены, что нежелательные сервисы не вызваны внешними зависимостями или системными конфигурациями, можете приступить к их устранению с учетом предоставленных рекомендаций.

Оцените материал
Добавить комментарий

Капча загружается...