Имеется небольшой скрипт 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