На этот вопрос уже есть ответ здесь:
Я написал сценарий для резервного копирования базы данных. Когда я выполняю его напрямую, он работает. Я попытался сделать это заданием cron, и пока оно выполняется (я проверял с помощью service status cron
), кажется, что оно тихо терпит неудачу.
Вот сценарий:
#!/bin/bash
echo "Starting mongo backup"
mkdir /home/ubuntu/backups
docker exec -it mongodb mongodump --archive=/root/mongodump.gz --gzip
docker cp mongodb:/root/mongodump.gz /home/ubuntu/backups/mongodump_$(date +%Y-%m-%d_%H-%M-%S).gz
echo "Mongo dump complete"
printf "[default]\naccess_key=\nsecret_key=\nsecurity_token=\n" > ~/.s3cfg
s3cmd put /home/ubuntu/backups/* s3://my-backup-bucket/
echo "Copy to S3 complete"
rm /home/ubuntu/backups/* -r
echo "Files cleaned"
Я использовал только абсолютные пути (РЕДАКТИРОВАТЬ: да, на самом деле я этого не делал) , без переменных окружения, без символов%. Не знаю, что я пропустил.
Одна возможная причина - то, что Вы не используете полные пути для команд, и некоторые Ваши команды не расположены в /usr/bin
или /bin
это принадлежит $PATH
envvar в Кроне по умолчанию.
Можно ли узнать, где расположен каждый исполняемый файл команд командой which
, например, which s3cmd
. Затем можно поместить команды с их полными путями в сценарии.
Другой подход должен присвоить новое значение для $PATH
в Вашем сценарии или в crontab
: Почему crontab сценарии не работают?
Можно ли перенаправить вывод Cronjob в файл для отладки, где проблема. С этой целью измените Ваш задание таким образом:
* * * * * /path/to/the-script >/path/to/log-file 2>&1
Кроме того, я предпочел бы использовать $HOME
вместо ~
в рамках сценариев.