Docker exec не работает в cron
У меня есть довольно простая команда, которая работает отлично как автономно как команда или bash script, но не тогда, когда я помещаю ее в crontab
40 05 * * * bash /root/scripts/direct.sh >> /root/cron.log
который имеет следующую строку
PATH=$PATH:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin
SHELL=/bin/sh PATH=/bin:/sbin:/usr/bin:/usr/sbin:/root/
# Mongo Backup
docker exec -it mongodb mongodump -d meteor -o /dump/
Я попытался изменить URL-адрес script на /usr/bin/scirpts/
не повезло
Я даже пытался запустить script непосредственно в cron
26 08 * * * docker exec -it mongodb mongodump -d meteor -o /dump/ >> /root/cron.log
не повезло, любая помощь была оценена.
ИЗМЕНИТЬ
Я не вижу ошибок в файле /root/cron.log
либо
Ответы
Ответ 1
Ваша команда docker exec
говорит, что ей нужен "псевдотерминал и он работает в интерактивном режиме" (-it flags), пока cron не подключается ни к одному TTY.
Попробуйте изменить команду docker exec на это и посмотреть, работает ли это?
docker exec mongodb mongodump -d meteor -o /dump/
Ответ 2
за то, что стоит, у меня была такая же проблема. Исправление вашей PATH, изменение разрешений и уверенность, что вы работаете как подходящий пользователь докеров, - все это хорошо, но этого недостаточно. Он будет продолжать сбой, потому что вы используете "docker exec -it", который сообщает docker использовать интерактивную оболочку. Измените его на "docker exec -t", и он будет работать нормально. Тем не менее, в этом случае не будет выходов из журнала. Наслаждайтесь!
Ответ 3
1) Убедитесь, что эта задача находится в корневом пользовательском crontab - возможно, это так, но вы не указали ее явно
2) cron
не может найти bash
. Я бы удалил его и позвонил непосредственно с вашим script после его выполнения:
chmod 755 /root/scripts/direct.sh
а затем введите запись crontab как 40 05 * * * /root/scripts/direct.sh 2>&1 >> /root/cron.log
Если он все еще не работает, тогда вы должны иметь полезный вывод в /root/cron.log
Ответ 4
отладка cron
1. /var/log
или sendmail
Поскольку crond
работает как демон, без возможности сбоя, выполнение важнее регистрации. Затем по умолчанию, если что-то пойдет не так, cron
отправит почту на [email protected]
отчет script вывод и ошибки.
Посмотрите /var/mail
или /var/spool/mail
для некоторых писем, возможно
и /etc/aliases
, чтобы узнать, где корневая почта - это sents.
2. crond и $PATH
Когда вы запускаете команду cron, обратите внимание, что $PATH
- это путь по умолчанию пользователя и не корневой путь по умолчанию (т.е. no */sbin
и другой зарезервированный путь к инструментам суперпользователя).
Для этого более простой способ - напечатать свой путь по умолчанию в среде, где все работает нормально:
echo $PATH
или исправьте script из командной строки:
sed -e "2aPATH='$PATH'" -i /root/scripts/direct.sh
Это добавит текущий $PATH
инициализатор в строке 2 в script.
Или это будет вызывать из вашего script все остальные PATH=
:
sed -e "s/PATH=[^ ]*\( \|$\)/\1/;2aPATH='$PATH'" -i /root/scripts/direct.sh
3. Запуск журналирования
Добавьте вверху вашего script:
exec 1>/tmp/cronlog-$$.log
exec 2>/tmp/cronlog-$$.err
Попробуйте следующее:
sed -e '1a\\nexec 1>/tmp/cronlog-$$.log\nexec 2>/tmp/cronlog-$$.err' -i ~/scripts/direct.sh
Окончательный script может выглядеть так:
#!/bin/bash
# uncomment two following lines to force log to /tmp
# exec 1>/tmp/cronlog-$$.log
# exec 2>/tmp/cronlog-$$.err
PATH='....' # copied from terminal console!
docker exec -it mongodb mongodump -d meteor -o /dump/
Исполняемый флаг
Если вы запустите script на
40 05 * * * bash /root/scripts/direct.sh
не требуется исполняемый флаг, но вы должны добавить их:
chmod +x ~/scripts/direct.sh
если вы хотите запустить:
40 05 * * * /root/scripts/direct.sh
Ответ 5
Вы уверены, что ваш script запущен? Добавьте еще одну команду, например touch /tmp/cronok
, перед вызовом docker exec
.
Не забывайте, что crontab нуждается в новой строке в конце. Используйте crontab -e
для его редактирования.
Перезапустите службу cron и проверьте журналы (grep -i cron /var/log/syslog
).
Если ваша ОС - redhat/centos/fedora, вы должны попробовать с именем пользователя (root
) между частотой и командой.
Проверьте почту с помощью команды mail
.
Проверьте разрешения crontab. chmod 644 /etc/crontab
.
Возможно, вы просто не хотите изобретать колесо.
Ответ 6
Вот несколько вещей, которые я бы изменил: во-первых, захватите STDERR вместе с STDOUT и удалите спецификацию оболочки в cron-- use #! в script.
40 05 * * * /root/scripts/direct.sh &>> /root/cron.log
Затем вы устанавливаете свой PATH в обратном порядке, и вам не хватает вашего shbang. Я понятия не имею, почему вы определяете SHELL как /bin/sh, когда вы используете bash вместо тире. Измените script на это.
#!/usr/bin/env bash
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/root
PATH=$PATH:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin
# Mongo Backup
docker exec -it mongodb mongodump -d meteor -o /dump/
Убедитесь, что с этим что-то лучше работает.