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/

Убедитесь, что с этим что-то лучше работает.