CentOS: порядок выполнения init.d скриптов и приоритеты chkconfig

Автор: | 08/05/2014
 

centos-logo-new-4На сервере использовался запуск TeamCity одной строкой в файле /etc/rc.local:

su -c teamcity '/home/teamcity/TeamCity/bin/runAll.sh start'

Но после перезагрузки — в логе TeamCity появились сообщения:

[2014-08-05 13:17:23,402] ERROR — jetbrains.buildServer.SERVER — Unable to change status of build 23908
jetbrains.buildServer.serverSide.db.UnexpectedDBException: Attempting to determine database type
SQL exception: Communications link failure

Т.е. — MySQL запустился после того, как запустился TeamCity.

Что бы это исправить — создадим отдельный скрипт для управления TeamCity в каталоге /etc/init.d/.

Для корректного запуска (т.е. — после MySQL) — рассмотрим «приоритеты» init:

# ls -1 /etc/rc3.d/
K01smartd
K10psacct
K10saslauthd
K15htcacheclean
K15svnserve
K20tomcat6
K50netconsole
K50snmpd
K50snmptrapd
K60nfs
K69rpcsvcgssd
K73slapd
K75quota_nld
K80tomcat55
K87cntlmd
K87restorecond
K88auditd
K89rdisc
K92ip6tables
K92iptables
S01sysstat
S10network
S11portreserve
S12rsyslog
S13irqbalance
S13rpcbind
S14nfslock
S18rpcidmapd
S19rpcgssd
S22messagebus
S25netfs
S26udev-post
S55sshd
S57ntpdate
S58ntpd
S64mysqld

Скрипты в каталоге rc3.d начинают выполняться на уровне init 3 в том порядке, в котором они расположены в каталоге (т.е. — чем выше «приоритет» — тем позже будет запущен скрипт).

При этом скрипты K (kill) — выполняются при остановке системы, а S (start) — при её запуске.

Очередь init runlevel выглядит так:

Runlevel 0 — уровень выключения системы;
Runlevel 1 – запуск системы в single user mode;
Runlevel 2 — загрузка системы в  multi-user mode, но без поддержки сети;
Runlevel 3 — аналогичен 2 уровню, но с загрузкой сети, без X-сервера;
Runlevel 4 — неопределённый уровень, который можно использовать на своё усмотрение;
Runlevel 5 — запуск системы  в multi-user mode, с поддержкой сети, X-сервером;
Runlevel 6reboot системы.

Находим приоритет MySQL:

# ls -l /etc/rc3.d/ | grep mysql
lrwxrwxrwx 1 root root 16 Sep 24 2013 S64mysqld -> ../init.d/mysqld

Имя S64 говорит о том, что это файл, выполянемый при старте MySQL, с приоритетом 64.

Что бы задать запуск нашего TeamCity позже, чем MySQL — нам нужно устновить приоритет выше — например, 70.

Сделать это можно с помощью инструкции chkconfig в файле скрипта.

Например, строка:

# chkconfig 345 70 40

означает запуск на уровнях 3, 4 или 5 с приоритетом 70, и остановка с приоритетом 40.

Создаём скрипт /etc/init.d/teamcity на основе шаблона /usr/share/doc/initscripts-9.03.38/sysvinitfiles с таким содержимым:

#!/usr/bin/env bash

# description: TeamCity build-server
# processname: teamcity
# chkconfig: - 70 30

# Source function library.
. /etc/init.d/functions

RETVAL=0
prog="teamcity"
LOCKFILE=/var/lock/subsys/$prog

USER="teamcity"
INSTALL="/home/teamcity/TeamCity"
SCRIPT="$INSTALL/bin/runAll.sh"

start() {
 printf "Starting $prog: n"
 su -l "$USER" -c "$SCRIPT start"
 RETVAL=$?
 [ $RETVAL -eq 0 ] && touch $LOCKFILE
 echo
 return $RETVAL
}

stop() {
 printf "Shutting down $prog: n"
 su -l "$USER" -c "$SCRIPT stop"
 RETVAL=$?
 [ $RETVAL -eq 0 ] && rm -f $LOCKFILE
 echo
 return $RETVAL
}

status() {
 printf "Checking $prog status: n"
 ps aux | grep "$INSTALL" | grep -v grep
}

case "$1" in
 start)
   start
   ;;
 stop)
   stop
   ;;
 status)
   status
   ;;
 restart)
   stop
   start
   ;;
 *)
   echo "Usage: $prog {start|stop|status|restart}"
   exit 1
   ;;
esac
exit $RETVAL
# chmod +x /etc/init.d/teamcity

Проверяем сам скрипт:

# service teamcity status
Checking teamcity status:
teamcity 2422 56.3 9.9 3344728 799008 pts/3 Sl 13:26 95:25 /home/teamcity/opt/jre1.7.0_51/bin/java -Djava.util.logging.config.file=./../conf/logging.properties -Xmx1536m -XX:MaxPermSize=768m -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -server -Xmx512m -XX:MaxPermSize=270m -Dlog4j.configuration=file:/home/teamcity/TeamCity/bin/../conf/teamcity-server-log4j.xml -Dteamcity_logs=../logs/ -Djava.awt.headless=true -Djava.endorsed.dirs=./../endorsed -classpath ./../bin/bootstrap.jar:./../bin/tomcat-juli.jar -Dcatalina.base=./.. -Dcatalina.home=./.. -Djava.io.tmpdir=./../temp org.apache.catalina.startup.Bootstrap start

Добавляем в автозапуск:

# chkconfig --add teamcity
# chkconfig --level 35 teamcity on
# chkconfig --list | grep teamcity
teamcity 0:off 1:off 2:off 3:on 4:off 5:on 6:off

И посмотрим — какие файлы создал chkconfig в каталоге /etc/rc.d:

# find /etc/rc* -name "*teamcity" | xargs ls -l
-rwxr-xr-x 1 root root 1033 Aug 5 17:03 /etc/rc.d/init.d/teamcity
lrwxrwxrwx 1 root root 18 Aug 5 17:03 /etc/rc.d/rc0.d/K30teamcity -> ../init.d/teamcity
lrwxrwxrwx 1 root root 18 Aug 5 17:03 /etc/rc.d/rc1.d/K30teamcity -> ../init.d/teamcity
lrwxrwxrwx 1 root root 18 Aug 5 17:03 /etc/rc.d/rc2.d/K30teamcity -> ../init.d/teamcity
lrwxrwxrwx 1 root root 18 Aug 5 17:05 /etc/rc.d/rc3.d/S70teamcity -> ../init.d/teamcity
lrwxrwxrwx 1 root root 18 Aug 5 17:03 /etc/rc.d/rc4.d/K30teamcity -> ../init.d/teamcity
lrwxrwxrwx 1 root root 18 Aug 5 17:05 /etc/rc.d/rc5.d/S70teamcity -> ../init.d/teamcity
lrwxrwxrwx 1 root root 18 Aug 5 17:03 /etc/rc.d/rc6.d/K30teamcity -> ../init.d/teamcity

Готово.