На сервере использовался запуск 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 6 — reboot системы.
Находим приоритет 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
Готово.