pg_dump 在一个脚本中作为 cron 作业失败,但在另一个脚本中却没有失败

pg_dump 在一个脚本中作为 cron 作业失败,但在另一个脚本中却没有失败

我的 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>PGPASSWORDPGUSERPGHOSTPGDATABASE
  • 当我在终端中手动运行脚本时,将 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

我不太清楚发生了什么,但现在它起作用了。我做了以下两件事:

  1. chmod +x pg_backup.sh-- 我已经完成了这个,并且脚本正在 cron 中运行,因为我可以在日志中得到一些输出
  2. 在文件上运行dos2unix以将任何 CR 或 CRLF 转换为 LF——我不确定这将如何解决这个问题,因为我是在 Mac 上的 Vim 中编写脚本的

相关内容