docker exec не работает в cron

у меня довольно простая команда, которая отлично работает автономно как команда или скрипт bash, но не тогда, когда я помещаю ее в 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 скрипта на /usr/bin/scirpts/ не повезло

Я даже пытался запустить скрипт в cron

26 08 * * * docker exec -it mongodb mongodump -d meteor -o /dump/ >> /root/cron.log

не повезло, любая помощь ценится.

редактировать

Я не вижу никаких ошибок в либо

6 ответов


код docker exec команда говорит, что ей нужен "псевдо-терминал и работает в интерактивном режиме" (-это флаги) в то время как cron не присоединяется к любым TTYs.

попробуйте изменить команду docker exec на это и посмотреть, работает ли это?

docker exec mongodb mongodump -d meteor -o /dump/

1) Убедитесь, что эта задача находится в root crontab пользователя-это, вероятно, так, но вы не написали его явно

2) cron не удается найти bash. Я бы удалил его и вызвал непосредственно ваш скрипт после того, как сделал его исполняемым:

chmod 755 /root/scripts/direct.sh

а затем установите запись crontab как 40 05 * * * /root/scripts/direct.sh 2>&1 >> /root/cron.log

если он все еще не работает, то у вас должен быть полезный вывод в /root/cron.log


cron отладки

1. /var/log или sendmail

As crond работа в качестве демона, без возможности сбоя, выполнение более важно, чем ведение журнала. Тогда по умолчанию, если что-то пойдет не так, cron отправит письмо по адресу $USER@localhost отчеты и ошибки сценария.

посмотреть /var/mail или /var/spool/mail для некоторых писем, может быть

и /etc/aliases чтобы увидеть, где почта root sents.

2. crond и $PATH

когда вы запускаете команду cron, позаботьтесь о том, что $PATH и путь пользователя по умолчанию и не корень путь по умолчанию (т. е. нет */sbin и другой зарезервированный путь к суперпользовательским инструментам).

для этого более простым способом является печать пути по умолчанию в среде, где все работает нормально:

echo $PATH

или исправьте свой скрипт из командной строки:

sed -e "2aPATH='$PATH'" -i /root/scripts/direct.sh

добавить текущую $PATH инициализатор в строке 2 вашего скрипта.

или это, будет выкрикивать из вашего скрипта все остальные PATH=:

sed -e "s/PATH=[^ ]*\( \|$\)//;2aPATH='$PATH'" -i /root/scripts/direct.sh

3. Force logging

добавить в верхней части вашего скрипта:

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

доработан скрипт может выглядеть так:

#!/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/

исполняемый флаг

если вы запустите свой скрипт

40 05 * * * bash /root/scripts/direct.sh

исполняемый флаг не требуется, но вы должны добавить они:

chmod +x ~/scripts/direct.sh

если вы хотите работать:

40 05 * * * /root/scripts/direct.sh

вы уверены, что ваш скрипт работает? Добавьте другую команду, например 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.

может быть, вы просто не хотите изобретать руль.


вот несколько вещей, которые я бы изменил - во-первых, захватите STDERR вместе с STDOUT и удалите спецификацию оболочки в cron-используйте #! в вашем сценарии вместо этого.

40 05 * * * /root/scripts/direct.sh &>> /root/cron.log

Далее, вы устанавливаете свой путь в обратном порядке, и вам не хватает вашего shbang. Я понятия не имею, почему вы определяете оболочку как /bin/sh, когда вы используете bash, а не dash. Измените сценарий на этот.

#!/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/

посмотрите, дает ли это что-то лучшее для работы с.


для чего это стоит у меня точно такая же проблема. Исправление вашего пути, изменение разрешений и убедитесь, что вы работаете как соответствующий пользователь docker-все это хорошо, но этого недостаточно. Он будет продолжать терпеть неудачу, потому что вы используете "docker exec-it", который говорит докеру использовать интерактивную оболочку. Измените его на "docker exec-t", и он будет работать нормально. Однако нигде не будет выхода журнала, сообщающего вам об этом. Наслаждайтесь!