LINUX.ORG.RU
решено ФорумAdmin

Порядок запуска сервисов в OpenRC

 , ,


0

2

Всех приветствую!

Пишу для openrc init скрипты для запуска сервисов Open Nebula.

Вот они слева направо:

opennebula

#!/sbin/openrc-run

name=$RC_SVCNAME
description="OpenNebula management"
command="/usr/bin/oned"
command_args="-f"
command_user="oneadmin:oneadmin"
pidfile="/run/one/${RC_SVCNAME}.pid"
supervisor="supervise-daemon"

start_pre() {
        /bin/mkdir -p /var/log/one
        /bin/mkdir -p /var/lock/one
        /bin/mkdir -p /run/one
        /bin/chown oneadmin:oneadmin -R /var/log/one /run/one /var/lock/one
        /usr/sbin/logrotate -s /tmp/logrotate.state -f /etc/logrotate.d/opennebula.logrotate
}

depend() {
        need mariadb
        after syslog networking localmount netmount
        before opennebula-scheduler opennebula-hem
        want opennebula-scheduler opennebula-hem opennebula-showback opennebula-ssh-agent opennebula-ssh-socks-cleaner
}

start() {
   ebegin "Starting $RC_SVCNAME"
   start-stop-daemon --background \
        --exec $command \
        --make-pidfile --pidfile $pidfile --user $command_user \
        --start -- $command_args
   eend $?
}

stop() {
   ebegin "Stopping $RC_SVCNAME"
   start-stop-daemon --stop \
        --retry TERM/10/KILL/10 \
        --exec $command \
        --pidfile $pidfile --user $command_user
   eend $?
}

stop_post() {
    /bin/rm -f /var/lock/one/one
    /usr/share/one/follower_cleanup
}

opennebula-hem

#!/sbin/openrc-run

name=$RC_SVCNAME
description="OpenNebula Hook Execution Service"
command="/usr/bin/ruby /usr/lib/one/onehem/onehem-server.rb"
command_user="oneadmin:oneadmin"
pidfile="/run/one/${RC_SVCNAME}.pid"
supervisor="supervise-daemon"

depend() {
        after syslog networking netmount opennebula
}

start() {
   ebegin "Starting $RC_SVCNAME"
   start-stop-daemon --background \
        --exec $command \
        --make-pidfile --pidfile $pidfile --user $command_user \
        --start
   eend $?
}

stop() {
   ebegin "Stopping $RC_SVCNAME"
   start-stop-daemon --stop \
        --exec $command \
        --pidfile $pidfile --user $command_user
   eend $?
}

opennebula-scheduler

#!/sbin/openrc-run

name=$RC_SVCNAME
description="OpenNebula Cloud Scheduler Daemon"
command="/usr/bin/mm_sched"
command_user="oneadmin:oneadmin"
pidfile="/run/one/${RC_SVCNAME}.pid"
supervisor="supervise-daemon"

depend() {
        after syslog networking netmount opennebula
}

start() {
   ebegin "Starting $RC_SVCNAME"
   start-stop-daemon --background \
        --exec $command \
        --make-pidfile --pidfile $pidfile --user $command_user \
        --start
   eend $?
}

stop() {
   ebegin "Stopping $RC_SVCNAME"
   start-stop-daemon --stop \
        --exec $command \
        --pidfile $pidfile --user $command_user
   eend $?
}

Проблема заключается в том, что при запуске основного сервиса opennebula происходят ошибки у «дочерних» сервисов:

fumoffu-test-node:~# /etc/init.d/opennebula start
 * Starting opennebula-scheduler ...
 * start-stop-daemon: fopen `/run/one/opennebula-scheduler.pid': No such file or directory                                                                              [ ok ]
 * Starting opennebula-hem ...
 * start-stop-daemon: fopen `/run/one/opennebula-hem.pid': No such file or directory                                                                                    [ ok ]
Potentially dangerous mode on /etc/logrotate.d/opennebula.logrotate: 0755
 * Starting opennebula ...                                                                                                                                              [ ok ]
fumoffu-test-node:~# 

Это, как я понял, происходит из-за того, что

  1. opennebula-hem и opennebula-scheduler запускаются раньше сервиса, который их вызывает - opennebula
  2. в сервисах opennebula-hem и opennebula-scheduler не прописано предварительно создавать каталог /run/one

Как можно сделать запуск этих сервисов «красиво»? Т.е., чтобы при старте opennebula всё-таки сразу выполнялась процедура start_pre(), а потом выполнялись дочерние скрипты?

 before opennebula-scheduler opennebula-hem

И

        want opennebula-scheduler opennebula-hem opennebula-showback opennebula-ssh-agent opennebula-ssh-socks-cleaner

Это как так так?

И создай им этот несчастный каталог.

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

Нет уж. Слишком просто. Надо сюда хейтеров systemd кастануть. Обычно выясняется, что они не только systemd, но и другие системы инициализации осилить не могут.

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

Твоя правда. Хотя в systemd примерно такой же механизм разруливания очередности.

adn ★★★ ()

То есть грубо говоря ты запускаешь дочерние процессы до того, как запускаешь родительский с его pre-start’ом. Убери из opennebula want. А в остальные добавь эту opennebula в depend

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

Это как так так?

Недоглядел.

И создай им этот несчастный каталог.

После ребута пропадает.

Пока что на каждом сервисе заставил выполняться процедуру start_pre() где создаётся каталог и назначаются права.

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

Да я и не поддержал бы холивар, я это так, подразнить... Не религиозный я, у меня у самого много где systemd, мне честно говоря пофиг. У всего есть документация, всё прекрасно настраивается. Что по дефолту стоит тем и пользуюсь.

Jameson ★★★★★ ()

after - это мягкая зависимость, точнее даже не зависимость, а рекомендация. Если нужна жесткая - тебе надо need.

Ссылку на документацию Jameson уже запостил выше.

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

Да, уже успел поэксперементировать. Доку читал, но мне надо лбом трахнуться, чтобы до меня дошло.
В общем, в «основном» сервисе я применил before, а в зависимых сервисах применил need. Таким образом я достиг своей цели - процедура start_pre() применяется только в основном сервисе.

Всем спасибо!

santic ()
Для того чтобы оставить комментарий войдите или зарегистрируйтесь.