我的 AWS 服务器上有两个 cron 作业(通过 触发)用于在特定数据库上crontab -e
调用。pg_dump
这两个脚本除了备份的目标数据库不同($PG_SRC_DB
)外,其余完全相同。其中一个脚本执行命令失败pg_dump
,但未输出任何错误或日志:
PGPASSWORD=$PG_SRC_PASSWORD $PG_DUMP_PATH --no-owner $PG_SRC_DB -h $PG_SRC_HOST -p $PG_SRC_PORT -U $PG_SRC_USER > dump.sql
我知道这一点是因为我已经将所有 stderr 和 stdout 转发到/tmp/cron.log
并且收到错误:
mv: cannot stat 'dump.sql': No such file or directory
在我运行之后发生了此命令,pg_dump
并且dump.sql
文件应该已经创建,但由于pg_dump
失败而失败
我已经调试了几个小时并完成了以下操作:
- 将 stderr 重定向到 stdout 错误日志
- 援引, ,和
export <PGVAR>
PGPASSWORD
PGUSER
PGHOST
PGDATABASE
- 当我在终端中手动运行脚本时,将 PATH 设置为我的 PATH
- 使用绝对路径
pg_dump
- 使用
#!/bin/bash -l
登录 shell - 将错误输出
pg_dump
到文件... > dump.sql 2> error.log
手动运行时,这两个脚本都可以在终端中运行。我不知道如何调试该pg_dump
命令,因为我没有从中获取任何日志。
答案1
通常,这种情况发生是因为终端和 cronjobs 的环境变量值不同。您可以尝试将终端环境导入脚本。假设您在 root 用户下运行脚本。尝试在脚本顶部添加一行。
#!/bin/bash
. /root/.profile
答案2
我不太清楚发生了什么,但现在它起作用了。我做了以下两件事:
chmod +x pg_backup.sh
-- 我已经完成了这个,并且脚本正在 cron 中运行,因为我可以在日志中得到一些输出- 在文件上运行
dos2unix
以将任何 CR 或 CRLF 转换为 LF——我不确定这将如何解决这个问题,因为我是在 Mac 上的 Vim 中编写脚本的