Systemd: запустить модуль после того, как другой модуль действительно запускается


20

В моем конкретном случае я хочу запустить remote-fsмодуль после того, как все glusterfsполностью запускается.

Мои системные файлы:

glusterfs цель:

node04:/usr/lib/systemd/system # cat glusterfsd.service 
[Unit]
Description=GlusterFS brick processes (stopping only)
After=network.target glusterd.service

[Service]
Type=oneshot
ExecStart=/bin/true
RemainAfterExit=yes
ExecStop=/bin/sh -c "/bin/killall --wait glusterfsd || /bin/true"
ExecReload=/bin/sh -c "/bin/killall -HUP glusterfsd || /bin/true"

[Install]
WantedBy=multi-user.target

remote-fs цель:

node04:/usr/lib/systemd/system # cat remote-fs.target 
[Unit]
Description=Remote File Systems
Documentation=man:systemd.special(7)
Requires=glusterfsd.service
After=glusterfsd.service remote-fs-pre.target
DefaultDependencies=no
Conflicts=shutdown.target

[Install]
WantedBy=multi-user.target

Хорошо, все демоны Gluster запускаются успешно, и я хочу смонтировать файловую систему Gluster через NFS, но общий ресурс Gluster NFS готовится не сразу после glusterfs.serviceзапуска, а спустя несколько секунд, поэтому обычно remote-fsне может смонтировать его даже с учетом директив Requiresи Afterуказаний.

Давайте посмотрим журнал:

Apr 14 16:16:22 node04 systemd[1]: Started GlusterFS, a clustered file-system server.
Apr 14 16:16:22 node04 systemd[1]: Starting GlusterFS brick processes (stopping only)...
Apr 14 16:16:22 node04 systemd[1]: Starting Network is Online.
Apr 14 16:16:22 node04 systemd[1]: Reached target Network is Online.
Apr 14 16:16:22 node04 systemd[1]: Mounting /stor...

Здесь все в порядке, удаленная файловая система (/ stor), кажется, монтируется после запуска glusterfs, как это и должно быть в соответствии с единичными файлами ... Но следующие строки:

//...skipped.....
Apr 14 16:16:22 node04 systemd[1]: Started GlusterFS brick processes (stopping only).

Какая? GlusterFS приготовился только к этому моменту! И тогда мы видим:

//...skipped.....
Apr 14 16:16:23 node04 mount[2960]: mount.nfs: mounting node04:/stor failed, reason given by server: No such file or directory
Apr 14 16:16:23 node04 systemd[1]: stor.mount mount process exited, code=exited status=32
Apr 14 16:16:23 node04 systemd[1]: Failed to mount /stor.
Apr 14 16:16:23 node04 systemd[1]: Dependency failed for Remote File Systems.
Apr 14 16:16:23 node04 systemd[1]: Unit stor.mount entered failed state.

Сбой монтирования, поскольку сервер NFS не был готов, когда systemd попытался смонтировать хранилище.

Из-за недетерминированной природы процесса загрузки systemd иногда (примерно 1 из 10 загрузок) монтирование этой файловой системы при загрузке завершается успешно.

Если подключение при загрузке не удалось, я могу войти на сервер и вручную смонтировать каталог / stor, поэтому служба NFS в Gluster, похоже, работает нормально.

Так как начать remote-fsпосле glusterfsd, т.е. после Started GlusterFS brick processesпоявления строки в журнале?

remote-fsКажется, это одна из самых последних целей, поэтому я не могу запустить ее после другой цели «обходного пути», которая фактически не требуется remote-fs.


5
Можете ли вы добавить ExecStartPre=<command>свойство в раздел Unit, glusterfsd.serviceкоторое выполняет команду, которая будет блокировать, пока glusterfs не будет готов? Это может помешать тому, чтобы the glusterfsd.serviceуказывал успех и активировал remotefs.target.
Бен Кэмпбелл

2
Я действительно смущен вашим glusterfsd.serviceфайлом модуля. Похоже, что на самом деле он не запускает никаких сервисов и фактически убивает любые glusterfsdпроцессы. Есть ли у вас какие-либо другие файлы, связанные с кластерами?
Грегл

Вы также можете показать stor.mountблок?
Брайан Редберд

Ответы:


3

Вы можете проанализировать последовательность загрузки systemd, выполнив следующую команду. Просмотрите выходной файл с помощью веб-браузера, поддерживающего SVG.

systemd-analyze plot > test.svg

Этот график предоставит вам статистику времени последней загрузки, которая предоставит вам более ясную точку зрения на проблему.

Я решил проблему с монтированием NFS, добавив mountкоманды в /etc/rc.local. Однако я не уверен, будет ли это работать с интеграцией Glusterd, стоит попробовать для быстрого исправления. Чтобы заставить systemd запустить rc.local, вы должны выполнить следующее условие:

# grep Condition /usr/lib/systemd/system/rc-local.service
ConditionFileIsExecutable=/etc/rc.d/rc.local

1

Как уже предложено другими; Я не уверен, является ли это зависимостью от 'glusterfsd', а не общей задержкой в ​​чем-то другом, например поиском DNS, который должен быть успешным, чтобы он мог разрешить 'узел4' и успешно смонтировать общий ресурс NFS.

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

Решением этой проблемы было создание сценария «ExecStartPre», который в основном проверяет наличие определенных зависимостей снова и снова, пока он не будет успешным (выход 0) или попыткой тайм-аута (выход 1).

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


0

Может быть, вы могли бы добавить это к remote-fsцели:

[Unit]
...
ConditionPathExists=/stor

0

Может быть, какой-то опрос может помочь. Это не зависит от systemd. Например, я использую mysql -e ';'в цикле, прежде чем делать что-то полезное с MySQL.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.