На сервере использовался запуск 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
Готово.