为什么工作脚本不能作为 cron 作业执行?

为什么工作脚本不能作为 cron 作业执行?

我编写了一个脚本来备份数据库。当我直接执行它时,它可以正常工作。我尝试将其设置为 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"

我只使用绝对路径(编辑:是的,实际上我没有),没有环境变量,没有未转义的%。我不知道我错过了什么。

答案1

一个可能的原因是,您没有使用命令的绝对路径,并且某些命令默认不在 Cron 中/usr/bin/bin不属于Cron 中的环境变量。$PATH

which例如,您可以通过命令 找出每个命令的可执行文件的位置which s3cmd。然后,您可以将命令及其绝对路径放入脚本中。

$PATH另一种方法是在脚本中或中为分配新值crontab为什么 crontab 脚本不起作用?

您可以将 Cronjob 的输出重定向到文件以调试问题所在。为此,请按如下方式修改您的作业:

* * * * * /path/to/the-script >/path/to/log-file 2>&1

此外,我更喜欢在脚本中使用$HOME而不是。~

相关内容