Существует разница между Before
/ After
и Wants
/ Requires
/Requisite
:первая группа указывает синхронизацию пусков блока, а последняя группа указывает зависимости . Часто разница между ними невелика, но иногда она важна. Чтение документации полезно для получения более подробной информации, так как я пропустил то, что вы не так часто видите.
В качестве примера предположим, что у вас есть несколько сервисов с зависимостями:
а.сервис
[Service]
Type=oneshot
ExecStart=/bin/sh -c 'sleep 5;/bin/false'
RemainAfterExit=yes
б.сервис
[Unit]
After=a.service
[Service]
Type=oneshot
ExecStart=/bin/echo B
RemainAfterExit=yes
ц.сервис
[Unit]
Requires=a.service
[Service]
Type=oneshot
ExecStart=/bin/echo C
RemainAfterExit=yes
д.сервис
[Unit]
After=a.service
Requires=a.service
[Service]
Type=oneshot
ExecStart=/bin/echo D
RemainAfterExit=yes
Что загружается (и в каком порядке )резко меняется в зависимости от того, что вы запускаете:
a
:a
b
:b
c
(или a
+c
):a
и c
одновременно(c
продолжает работать, даже если a
не работает)d
(или a
+d
):a
-> c
(, если a
запущен успешно)a
+b
:a
->b
(независимо от того, запущен ли a
)К чему вся эта сложность? Это для ускорения загрузки юнитов. Если сервисы не имеют Before
или After
, ссылающихся друг на друга, то они могут быть запущены в одно и то же время (, предполагая, что они не нужны другим устройствам!)
Куда берутся файлы .target
? Они объединяют единицы в функциональные группы,таким образом, когда система запускается (или останавливается и т. д. ), устройства, необходимые для этой фазы, могут запускаться вместе, и устройства могут указать, что они хотят дождаться запуска другой фазы. Например, модуль может включать After=network.target
, чтобы убедиться, что сеть имеет возможность инициализироваться перед запуском, даже если он установлен как часть multi-user.target
.
Если вы хотите просмотреть порядок, в котором юниты зависят друг от друга, вы можете запустить systemctl list-dependencies
(, он не скажет вам порядок, в котором они загружались, поскольку он несколько случайный за пределами Before
/ After
. настройки.)