LINUX.ORG.RU
ФорумAdmin

Когда systemd таргет считеться достигнутым?

 


0

1

Доки четко говорят что WantedBy не влияет на порядок, только на то, будет ли сервис активирован или нет. Я могу написать WantedBy=multi-user.target и тут же After=multi-user.target. Тоесть systemd разделят порядок и зависимости. Если так то multi-user.target после base.target достигается почти мгновенно, т.к. никто не пишет Before=multi-user.target в сервисах, это антипатерн. Тоесть multi-user.target не ждет сервисов у которіх стоит WantedBy=multi-user.target. НО!! на практике у меня есть сервис, который должен запускаться самым последним, у него WantedyBy=multi-user.target + After=multi-user.target и судя по логам он действительно запускается в конце, не могу это никак обьяснить. Насколько это детерминировано?

по идее нет, недетерминированно. Также, «запускается последним» - ещё не означает что он начинает запускаться когда остальные уже запустились. Может быть условно ситуация что дисплейный сервер удк начал запускаться, а сокет для общения ещё не создал.

Вцелом идея «запускаться последним» простой реализации в systemd не имеет.

На практике обычно имеет смысл прописать завистмость не от таргета, а от какого-то сервиса, доступность которого говорит что «пора», по аналогии с каким-то уже существующим сервисом.

Чтоб увидеть эти аналогии можно позапускать systemctl list-dependencies с разными опциями (те которые отобразят древовидную картину before/after зависимостей)

Также, если речь пошла про multi-user - может быть сценарий вообще лучше ложится на запуск сервиса в пользовательской сессии - https://wiki.archlinux.org/title/Systemd/User

GPFault ★★★
()
Ответ на: комментарий от GPFault

Я просто пытаюсь смегрировать дистро с sysvinit на sysetmd. У меня был сервис с приориеттом 99 при старте, который создовал файл в /var/run, и всякие демоны видели, что загрузка завершена, когда появляется этот файл. И еще был сервис который выполнял run-parts на одной специалольной папке по завершению загрузки, туда разные пакеты скрипты кидали всякие. Не представляю как это мегрировать

mishka06
() автор топика
Ответ на: комментарий от mishka06

загрузка завершена

мне кажется надо более точно сформулировать, что нужно

что значит загрузка завершена?

что именно хотят знать эти всякие демоны?

выполнял run-parts

ну сделать юнит, который выполнит run-parts на папке - не проблема

sergej ★★★★★
()
Ответ на: комментарий от sergej

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

sergej ★★★★★
()
Ответ на: комментарий от sergej

В этом же и проблема. Насколько я понимаю, то что multi-user.target активный не значит, что все сервисы с WantedBy=multi-user.target тоже стали активными. Даже если у меня будет таргет с After=multi-user.target и я буду отталкиваться то него, это не гарантирует что мой сервис запуститься в конце

mishka06
() автор топика
Ответ на: комментарий от sergej

Загрузка завершена значит что все инит скрипты запустились, в случае с systemd что все сервисы запусились (ну кроме того который файл создает само собой)

run-parts у меня тоже была с приоритетом S99, там были скрипты которые должны выполнятся в конце загрузки

mishka06
() автор топика

Это же очень просто проверить.
Напиши сервис, который делает sleep на 10 минут.
Воткни его в multi-user.target.
Мониторь multi-user.target, когда он станет active.

bigbit ★★★★★
()
Последнее исправление: bigbit (всего исправлений: 1)
Ответ на: комментарий от mishka06

По идее желаемого эффекта можно добиться сделав в скрипте ожидание через

systemctl is-system-running --wait

Надо только аккуратно оставить его тип simple/exec, чтоб он сам себя не начал ждать

GPFault ★★★
()
Ответ на: комментарий от GPFault

да дейстительно, наверное стоет сделать сервис диспатчер, который будет запускать скрипт с systemctl is-system-running –wait в первой строчке и блокироваться, а всякие скрипты, которые были с приоритетом 99 сделать статическими (без секции [Install] и запускать их в скрипте через systemctl start)

mishka06
() автор топика

Сделай сервис который убивает все запущенные приложения кроме себя и он гарантированно будет последним.

olelookoe ★★★★
()
  • Markdown
Пустая строка (два раза Enter) начинает новый абзац. Знак '>' в начале абзаца выделяет абзац курсивом цитирования.
Внимание: прочитайте описание разметки Markdown.
Используйте Ctrl-Enter для размещения комментария