我有以下 bash 脚本来运行 postgres 备份,压缩它并将其推送到 google cloud bucket。它安装在 google cloud VM 上,因此我可以访问 gsutil。此 vm 的服务帐户还授予我将文件添加到 bucket 的权限。
// /home/myusername/bash/pgbackup.sh
#!/bin/sh
FILENAME="backup_$(date +"%Y_%m_%d_%H_%M_%S").sql";
PGPASSWORD=pg_password pg_dump -U pg_username db_name > $FILENAME;
tar -cvzf $FILENAME.tar.gz $FILENAME;
gsutil cp $FILENAME.tar.gz gs://bucket-name/$FILENAME;
rm -f $FILENAME $FILENAME.tar.gz;
crontab 命令如下所示:
// sudo crontab -e
0 * * * * /home/myusername/bash/pgbackup.sh >> backups.log
crontab 不起作用。它运行是因为我一小时后得到了一个 backups.log 文件,但这个文件是空的。但是 bucket 中没有文件。当我单独运行 shell 脚本时,它起作用了。我得到了 gsutil-output,并且可以在我的 bucket 中找到备份。
为了测试目的,我每分钟运行一次这个 crontab,但我的存储桶中没有备份,并且在 backups.log 中也没有得到任何输出。
该脚本之前有其他内容(本地保存备份)然后它起作用了,所以我知道我正确调用了它(它在 sudo crontab 文件中)。
编辑:解决方案
解决方案(?)是向文件添加绝对路径。
FILENAME = "/home/username/backup_$(date +"%Y_%m_%d_%H_%M_%S").sql";