Вопрос или проблема
Это, возможно, глупый вопрос, но кроме нескольких общих вариантов / обоснованных предположений / полного понимания ядра/systemd, есть ли способ определить, какие зависимости и в каком порядке должна быть определена часть кода при создании службы systemd?
Например, у меня есть часть кода, которая использует последовательный порт, uinput и сокеты – я обнаружил, что мне нужно включить это в службу:
[Unit]
BindsTo=dev-serial0.device
After=dev-serial0.device
Чтобы последовательный порт был доступен, когда она запускается – но я не могу, например, найти, есть ли служба или другая зависимость для uinput, которую мне нужно было бы включить.
Так что – есть ли где-то список служб/имен или команда, которую вы можете выполнить, чтобы показать, от чего зависит конкретный исполняемый файл?
Нет, для этого необходимо знать, что исполняемый файл делает во время выполнения, и поскольку ваш компьютер является универсальным, это потребует анализа всех возможных путей кода.
Есть ли способ выяснить зависимости systemd
да поиск в интернете и чтение любой статьи о дереве зависимостей systemd даст лучшие объяснения, чем я мог бы написать здесь, например, https://www.baeldung.com/linux/systemd-execution-tree
Команды, которые вы бы использовали для ответа на этот вопрос:
systemd-analyze
и смотритеman systemd-analyze
systemd-analyze blame
systemd-analyze critical-chain
systemd-analyze dump
systemd-analyze plot
systemd-analyze dot
systemd-analyze unit-paths
systemctl list-dependencies
есть ли где-то список служб/имен или команда, которую вы можете выполнить, чтобы показать, от чего зависит конкретный исполняемый файл?
да, то, что я только что упомянул, предоставит эту информацию
есть ли способ определить, какие зависимости и в каком порядке должна быть определена часть кода
только вы (автор) должны знать, какие зависимости необходимы для вашего кода, который, как я предполагаю, вы имеете в виду службу, которую вы создаете, которая затем выполнит какую-то часть кода, указанную в ExecStart=
. Что касается необходимости знать, в каком порядке ваша часть кода должна иметь определенные [зависимости службы], то это задача systemd, вам не нужно об этом беспокоиться, все это в значительной степени решается с помощью всех назначений Before=
и After=
в каждом файле службы, которые затем составляют всю систему зависимостей systemd. Вам не обязательно нужно знать все дерево, но вы можете взглянуть на него, как я описал выше. Все, что вам нужно знать, это что именно ваша служба и часть кода требуют в качестве зависимости (т.е. уже работающие), что будет указано с помощью оператора After=
в вашем файле службы.
Ответ или решение
Создание системного демона с использованием systemd требует тщательного понимания зависимостей и порядка их загрузки. Вопрос о том, как определить зависимости для создаваемой службы, не является неуместным, а скорее актуальным для разработчиков и системных администраторов.
Установление зависимостей для сервисов systemd
-
Понимание зависимостей: В первую очередь, необходимо понимать, какие ресурсы и службы необходимы вашему исполняемому коду. В вашем случае, например, если код использует последовательный порт,
uinput
и сокеты, это требует явного указания на ресурсы, которые должны быть доступны на момент запуска вашей службы. -
Определение зависимостей: Вы можете использовать следующие методы для анализа необходимых зависимостей:
-
systemd-analyze: Это мощная утилита, которая предоставляет информацию о загрузке и зависимостях служб в системе. Команды, которые могут быть полезны:
systemd-analyze blame
: показывает время загрузки всех служб, что позволяет определить, какие из них могут быть задержаны.systemd-analyze critical-chain
: демонстрирует критическую цепочку зависимостей, которая позволяет видеть, какие службы должны быть запущены, прежде чем ваша служба сможет стартовать.systemd-analyze dump
: выводит всю информацию о текущих юнитах и их состояниях.systemd-analyze plot
иsystemd-analyze dot
: генерируют графические представления зависимостей.
-
systemctl list-dependencies: Используйте эту команду, чтобы просмотреть зависимости конкретной службы. Например, выполните
systemctl list-dependencies имя_службы
для получения информации о том, какие службы требуются.
-
-
Документация и источники: Необходимо также обращаться к документации по systemd и к специфичным руководствам по службам, которые вы используете. Можно найти множество статей и руководств по теме зависимостей systemd. Например, Baeldung демонстрирует, как визуализировать дерево зависимостей.
-
Определение порядка запуска: Основная задача разработчика при создании службы — это указание на зависимости, которые критически важны для её работы. Используйте директивы
After=
,Before=
,Requires=
иWants=
в вашем файле службы. Эти директивы позволяют системе управлять порядком запуска ваших сервисов. Однако не забудьте, что последовательность загрузки будет управляться systemd на основе указанных вами зависимостей. -
Анализ кода: Не менее важным аспектом является анализ самого кода вашего приложения. Если вы знаете, как именно ваше приложение взаимодействует с системными ресурсами, это поможет определить дополнительные зависимости. Например, если ваше приложение требует
uinput
, вам нужно будет удостовериться, что модули для работы с виртуальными устройствами загружаются до старта вашей службы.
Заключение
В итоге, процесс определения зависимостей для вашей службы systemd включает в себя использование системных инструментов для анализа зависимостей, понимание работы вашего приложения с системными ресурсами и корректное распределение директив в файле службы. Ответственность за определение необходимых зависимостей лежит на вас, как на разработчике, и понимание работы systemd значительно упростит этот процесс. Вы не обязаны знать всю структуру systemd, но важно осознавать, какие зависимости требуются для вашего конкретного случая.