如何在ruby脚本中获得致命错误的确切消息

如何在ruby脚本中获得致命错误的确切消息,ruby,postgresql,pg-dump,pg-restore,Ruby,Postgresql,Pg Dump,Pg Restore,我有一个Ruby脚本,它从远程服务器获取PostgreSQL数据库转储。脚本接受动态输入:密码、用户名、主机和数据库名称。因此,用户可能会为这些字段提供错误的输入。如果输入错误,我会收到致命错误 pg_dump:[archiver(db)]与数据库“sc_开发1”的连接 失败:致命:数据库“sc_development1”不存在 如果我们在执行以下操作时出现错误的数据库 system("PGPASSWORD="#{source_postgres_password}" pg_dump -U "#{

我有一个Ruby脚本,它从远程服务器获取PostgreSQL数据库转储。脚本接受动态输入:密码、用户名、主机和数据库名称。因此,用户可能会为这些字段提供错误的输入。如果输入错误,我会收到致命错误

pg_dump:[archiver(db)]与数据库“sc_开发1”的连接 失败:致命:数据库“sc_development1”不存在

如果我们在执行以下操作时出现错误的数据库

system("PGPASSWORD="#{source_postgres_password}" pg_dump -U "#{source_postgres_username}" -h "#{source_host}" "#{source_database_name}" > "#{store_backup_file_path}/#{timestamp}/#{source_database_name}".sql")
目前,我正在通过选中
$?
获取进程状态来处理此问题,但我需要更多。我想获得要在日志文件中打印的确切致命错误消息。如何做到这一点

我想将在终端中看到的致命错误消息从运行脚本的位置打印到日志文件中

有什么方法可以告诉我致命错误的详细信息吗。我知道在Ruby中,挽救致命错误是不可能的。当我阅读时,我可以打印我自己的消息,以防出现致命错误,但这不是我想要的。我需要确切的致命错误消息。

您可以使用模块和
capture3
功能来捕获stdout、stderr和状态:

[3] pry(main)> require 'open3'
=> true
[4] pry(main)> stdout, stderr, status = Open3.capture3("ls asd")
=> ["", "ls: cannot access 'asd': No such file or directory\n", #<Process::Status: pid 19314 exit 2>]

另请参见:

来自
pg_dump
的错误消息中带有“致命”一词的错误与Ruby中的致命错误不同。如果使用后者,脚本将立即退出,并且无法处理
$?
。看看——它有各种各样的方法与stdin、stdout和stderr交互。可能对你有用。顺便说一句,你的
系统
命令的参数缺少一些引号。获取错误为,Errno::enoint:没有这样的文件或目录-from/home/raj/.rvm/rubies/ruby-2.6.3/lib/ruby/2.6.0/open3.rb:213:“spawn”中非常奇怪-
open3
在stdlib中,所以应该可以使用。
require 'open3'
_, stderr, status = capture3(PGPASSWORD="#{source_postgres_password}" pg_dump -U "#{source_postgres_username}" -h "#{source_host}" "#{source_database_name}" > "#{store_backup_file_path}/#{timestamp}/#{source_database_name}".sql)
puts "Postgres error: #{stderr}"  unless status.error