Вопрос или проблема
Я создал и включил службу:
$ 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.
Этот симптом указывает на проблему с обнаружением системных юнитов после перезагрузки, что может быть связано с несколькими факторами:
-
Упоминание некорректных путей: Обратите внимание, что наличие символических ссылок на файл службы не всегда гарантирует корректное обнаружение. Проверьте целостность и правильность символических ссылок.
-
Незавершённая регистрация: Команда
systemctl daemon-reload
используется для обновления списка юнитов и чтения их конфигураций. В некоторых случаях изменения в конфигурации могут не вступить в силу без её выполнения. -
Ошибки в конфигурационных файлах: Незначительные ошибки в конфигурации могут привести к тому, что systemd игнорирует службу. Перепроверьте конфигурационный файл
imaservice.service
на наличие синтаксических ошибок. Убедитесь, что все необходимые зависимости указаны верно. Например, ошибка в типе зависимости (например, “After=network-online.service
” вместо “After=network-online.target
”) может вначале привести систему в диссонанс. -
Проблемы с правами доступа: Не забудьте проверить права доступа и владение файлами служб. Файлы должны принадлежать пользователю root и быть доступными для чтения.
-
Копирование вместо ссылок: Если проблема продолжается, как временное решение, можно воспользоваться методом, предложенным вами — скопировать файл службы в целевой каталог без использования символических ссылок:
sudo cp /path/to/imaservice.service /etc/systemd/system/multi-user.target.wants/imaservice.service
Это решение иногда показывает свою эффективность, так как устраняет возможность проблемы с разрешением символических ссылок.
Подведение итогов
В описанной проблеме можно выделить несколько ключевых моментов, каждый из которых требует внимания при конфигурировании служб через systemd. Регулярная проверка состояния служб, их зависимостей, а также корректность конфигурационных файлов помогут избежать подобных ситуаций. Наконец, использование команды journalctl
может помочь в диагностике проблем, даже если она не всегда даёт ответы, как это было в случае с ошибкой указания зависимостей.
Если все предложенные шаги не приводят к желаемому результату, рекомендуется обратиться к логам systemd для более глубокого анализа или обратиться за помощью к более опытным системным администраторам в соответствующих форумах и сообществах.