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", и он будет работать нормально. Однако нигде не будет выхода журнала, сообщающего вам об этом. Наслаждайтесь!