Навеяно этой темой: Как отладить выполнение скрипта в Crond?
Нужно мне увидеть своими глазами, как работает скрипт, будучи запущенном из-под crond.
Для этого написал себе «эмулятор» крона. Это просто исполнимый sh/bash файл, в котором искуственно подготавливается та среда, которая создается кроном при запуске скриптов. В конце этого файла идет вызов скрипта, который должен запускаеться из-под крона.
Для эмулирования среды я учел три вещи:
1. Шелл, в котором выполняет скрипты крон. В моем случае крон запускает команды из-под sh, поэтому вначале скрипта-«эмулятора» у меня прописано:
#!/bin/sh
2. Пользователь, под которым выполняются команды при вызове из крона. У меня в кроне настроен запуск команд под моим пользователем xi. Я буду запускать скрипт «эмулятора» залогинившись как пользователь xi.
3. Я получил значения переменных окружения, которые создаются при запуске команд из-под крона. Для этого вызвал в кроне команду:
export >> /tmp/cron_enviroment.txt
Результат:
export HOME=«/home/xi»
export LOGNAME=«xi»
export OLDPWD=«/home/xi»
export PATH=«/usr/bin:/bin»
export PWD=«/home/xi»
export SHELL=«/bin/sh»
export SHLVL=«1»
export USER=«xi»
Для того, чтобы получить именно такие переменные окружения, скрипт-«эмулятор» у меня выглядит так:
#!/bin/sh
echo «Список переменных окружения:»
list=`export | sed 's/^export //' | sed 's/=.*//'`
echo $list
echo «Удаляются все переменные окружения...»
for line in $list
do
echo «Удаляется переменная: $line»
unset $line
done
export HOME=«/home/xi»
export LOGNAME=«xi»
export OLDPWD=«/home/xi»
export PATH=«/usr/bin:/bin»
export PWD=«/home/xi»
export SHELL=«/bin/sh»
export SHLVL=«1»
export USER=«xi»
echo «Установлен новый набор переменных:»
export
echo «Запускается пользовательский скрипт:»
sh -c /opt/script/reserve_backup.sh
Вроде-бы всё, что знаю, учёл.
Однако, результат получился не тот что ожидал.
Скрипт из-под крона не работает. А скрипт в эмуляторе - работает нормально. Так что я так и не могу увидеть, в чем проблема, когда скрипт выполняется в кроне.
Вопрос: что я еще не учел при изготовлении эмулятора?
Начальный каталог запуска отпадает, так как в пользовательском скрипте первой командой идет переход в нужный каталог, и все пути везде в коде абсолютные.
Что еще может быть?