Linux: не выполняется задача из crontab

Автор: | 20/01/2014

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