我写了一个脚本来备份数据库。当我直接执行它时,它起作用了。我试图让它成为一个 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"
Run Code Online (Sandbox Code Playgroud)
我只使用了绝对路径(编辑:是的,实际上我没有),没有环境变量,没有未转义的 %。我不知道我错过了什么。
一个可能的原因是您没有使用命令的绝对路径,并且您的某些命令默认不位于/usr/bin
或/bin
不属于$PATH
Cron 中的 envvar。
你可以找到位于每个可执行的命令在命令的地方which
,例如which s3cmd
。然后,您可以将带有绝对路径的命令放入脚本中。
另一种方法是$PATH
在您的脚本中或在以下内容中分配新值crontab
:为什么 crontab 脚本不起作用?
您可以将 Cronjob 的输出重定向到文件以调试问题所在。为此,以这种方式修改您的工作:
* * * * * /path/to/the-script >/path/to/log-file 2>&1
Run Code Online (Sandbox Code Playgroud)
此外,我更喜欢在脚本中使用$HOME
而不是使用~
。