Ubuntu 18.04 и исчезновение службы systemctl

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

Я создал и включил службу:

$ sudo systemctl enable /path/to/imaservice.service
Создана символическая ссылка /etc/systemd/system/multi-user.target.wants/imaservice.service → /path/to/imaservice.service.
Создана символическая ссылка /etc/systemd/system/imaservice.service → /path/to/imaservice.service.

Она существует и сохраняется в обоих:

/etc/systemd/system/imaservice.service
/etc/systemd/system/multi-user.target.wants/imaservice.service

Теперь я могу спокойно запускать/останавливать/проверять её статус. Когда я перезагружаю компьютер, я не могу её запустить. Я получаю следующее сообщение:

$sudo systemctl is-enabled imaservice
enabled

Однако:

$sudo systemctl start imaservice
Не удалось запустить imaservice.service: Unit imaservice.service не найден.

Каждый раз при перезагрузке мне приходится снова включать с помощью:

$sudo systemctl enable imaservice
$sudo systemctl daemon-reload

И после этого всё возвращается в норму.

Что я делаю не так?

У меня была такая же проблема.

Единственное решение, которое я нашел – это скопировать службу без создания ссылок

sudo cp /path/to/imaservice.service /etc/systemd/system/multi-user.target.wants/imaservice.service

Таким образом это работает.

У меня была проблема, когда я мог выполнять systemctl status и systemctl stop, но не systemctl start на службе, хотя она действительно запускалась при загрузке LOL.

Проблема оказалась в том, что у меня была опечатка в одном из моих .service файлов, я указал After=network-online.service

должно было быть After=network-online.target

хотя она все равно загружалась с этой опечаткой и запускалась.

затем она и зависимые службы начали себя вести как обычные службы. Обалдеть, не могу поверить, что systemd не фиксировал эти ошибки опечаток в journalctl…

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

Проблема исчезновения службы после перезагрузки в Ubuntu 18.04 предполагает необходимость детального анализа работы с systemd — системой инициализации и управления службами в Linux. Рассмотрим её подробно на примере описанной ситуации.

Теория

systemd — это менеджер системы и сервисов для Linux, который заменяет многие традиционные программы инициализации. Он управляет процессами во время запуска системы и предоставляет возможность контролировать и поддерживать активные процессы. Службы в systemd определяются с помощью конфигов, называемых юнитами.

Когда вы используете команду systemctl enable, система создаёт символические ссылки из файла службы в каталог /etc/systemd/system/ или его подкаталоги на основе указываемых целей, таких как multi-user.target.wants/. Эта команда означает, что служба должна запускаться автоматически при достижении соответствующего целевого уровня.

Пример

В вашем случае вы создали службу и успешно её активировали с помощью команд:

$ sudo systemctl enable /path/to/imaservice.service
Created symlink /etc/systemd/system/multi-user.target.wants/imaservice.service → /path/to/imaservice.service.
Created symlink /etc/systemd/system/imaservice.service → /path/to/imaservice.service.

После выполнения этой команды служба появляется в указанных местах, и её можно успешно управлять до перезагрузки системы.

Применение

После перезагрузки, вы обнаруживаете, что хотя команда systemctl is-enabled imaservice возвращает состояние "enabled", попытка запустить службу приводит к ошибке:

Failed to start imaservice.service: Unit imaservice.service not found.

Этот симптом указывает на проблему с обнаружением системных юнитов после перезагрузки, что может быть связано с несколькими факторами:

  1. Упоминание некорректных путей: Обратите внимание, что наличие символических ссылок на файл службы не всегда гарантирует корректное обнаружение. Проверьте целостность и правильность символических ссылок.

  2. Незавершённая регистрация: Команда systemctl daemon-reload используется для обновления списка юнитов и чтения их конфигураций. В некоторых случаях изменения в конфигурации могут не вступить в силу без её выполнения.

  3. Ошибки в конфигурационных файлах: Незначительные ошибки в конфигурации могут привести к тому, что systemd игнорирует службу. Перепроверьте конфигурационный файл imaservice.service на наличие синтаксических ошибок. Убедитесь, что все необходимые зависимости указаны верно. Например, ошибка в типе зависимости (например, “After=network-online.service” вместо “After=network-online.target”) может вначале привести систему в диссонанс.

  4. Проблемы с правами доступа: Не забудьте проверить права доступа и владение файлами служб. Файлы должны принадлежать пользователю root и быть доступными для чтения.

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

    sudo cp /path/to/imaservice.service /etc/systemd/system/multi-user.target.wants/imaservice.service

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

Подведение итогов

В описанной проблеме можно выделить несколько ключевых моментов, каждый из которых требует внимания при конфигурировании служб через systemd. Регулярная проверка состояния служб, их зависимостей, а также корректность конфигурационных файлов помогут избежать подобных ситуаций. Наконец, использование команды journalctl может помочь в диагностике проблем, даже если она не всегда даёт ответы, как это было в случае с ошибкой указания зависимостей.

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

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

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