Всех приветствую!
Пишу для 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:~#
Это, как я понял, происходит из-за того, что
- opennebula-hem и opennebula-scheduler запускаются раньше сервиса, который их вызывает - opennebula
- в сервисах opennebula-hem и opennebula-scheduler не прописано предварительно создавать каталог /run/one
Как можно сделать запуск этих сервисов «красиво»? Т.е., чтобы при старте opennebula всё-таки сразу выполнялась процедура start_pre(), а потом выполнялись дочерние скрипты?