问题:
数据库为PostgreSQL,其他数据库同理。
由于数据库是用docker-compose运行,所以直接用docker-compose命令直接备份。测试终端直接运行备份没问题,将命令添加到crontab定时任务,却得到一个数据为0的空文件,命令失效。
终端备份执行命令,(终端执行备份没问题,数据完整)
sudo docker-compose exec database pg_dump hackmd -U hackmd > /home/ubuntu/backup/codimd_`date +%F`.sql
添加定时任务crontab -e
为,(得到一个数据为0的空文件,命令失效)
0 2 * * * cd /home/ubuntu/codimd-2.4.1/deployments/ && sudo /usr/local/bin/docker-compose exec database pg_dump hackmd -U hackmd > /home/ubuntu/backup/codimd_`date +\%F`.sql
原因:
将命令写入脚本,执行脚本没问题。将脚本加入定时任务,再次失效。所以跟脚本没关系。
1:由于docker-compose命令跟其他常规命令路径不一样,路径为 /usr/local/bin/docker-compose
,常规命令路径为bin/bash
等,所以crontab默认执行的为常规路径命令。需要使用绝对路径。
2:命令选项:-T:从而禁止分配伪终端,Disable pseudo-tty allocation. By default docker-compose exec allocates a TTY
解决后命令:
根据以上命令,重新更改crontab定时任务。
crontab -e
0 2 * * * sudo /usr/local/bin/docker-compose -f /home/ubuntu/codimd/deployments/docker-compose.yml exec -T database pg_dump hackmd -U hackmd > /home/ubuntu/backup/codimd_`date +\%F`.sql
测试生效,更改完成。
打赏作者