Имеется небольшой скрипт TC_backup.sh, основная задача которого — запустить maintainDB.sh для создания резервной копии файлов и базы данных TeamCity.
Подробнее про скрипт maintainDB.sh можно прочитать в статье TeamCity: резервное копирование сервера с помощью утилиты maintainDB.
Однако архивы не создавались, хотя в файле /var/log/cron ошибок не было, и задача выполнялась:
... Jan 20 13:35:01 lms-teamcity CROND[28601]: (teamcity) CMD (/home/teamcity/scripts/TC_backup.sh) ...
Выполнение файла maintainDB.sh записывается в лог:
...
backup () {
/home/teamcity/TeamCity/bin/maintainDB.sh backup --all -M -F $BDIR/$ARHNAME >> $LOGFILE
}
...
В файле лога наблюдается следующее сообщение:
Neither the JAVA_HOME nor the JRE_HOME environment variable is defined Please make sure one of the environment variables is defined and is pointing to a valid Java (JRE) installation, then run again
Хотя переменная JAVA_HOME для пользователя выставлена.
Проблема возникает из-за того, что демон crond выполняет задачи с «минимальным» набором переменных окружения.
Что бы проверить это — в скрипт бекапирования, который запускается cron-ом, добавим новую функцию, которая будет получать переменные и записывать их в файл:
...
getenv () {
env >> $BDIR/envlog.log
}
...
После запуска задачи cron-ом — проверим файл:
$ cat envlog.log SHELL=/bin/sh USER=teamcity PATH=/usr/bin:/bin PWD=/home/teamcity HOME=/home/teamcity SHLVL=2 LOGNAME=teamcity _=/usr/bin/env
Для решения проблемы — добавляем передачу переменной JAVA_HOME в скрипт бекапа:
export JAVA_HOME="/usr/java/jdk1.6.0_45/" export JAVA_OPTS="-Xmx1536m -XX:MaxPermSize=768m" export JRE_HOME="/usr/java/jdk1.6.0_45/jre"
Другой вариант — задать вызов файла .bashrc (или другого, в котором задаются переменные окружения для пользователя) из cron-задачи перед вызовом скрипта TC_backup.sh:
$ crontab -l * * * * * . $HOME/.bashrc; /home/teamcity/scripts/TC_backup.sh
Либо — вызвать файл .bashrc прямо из файла бекапирвоания:
$ cat /home/teamcity/scripts/TC_backup.sh | grep bash #!/bin/bash . $HOME/.bashrc




