【问题标题】:How to make Ruby wait for mysqldump?如何让Ruby等待mysqldump?
【发布时间】:2012-09-25 17:00:36
【问题描述】:

我想将mysqldump的输出赋值给一个变量,以后再使用生成的输出。

尝试 1:

    > 1.9.3-p125 :020 > x = `mysqldump falala` mysqldump: Got error: 1045: Access denied for user 'root'@'localhost' (using password: NO) when
    > trying to connect  
    => "" 
    > 1.9.3-p125 :021 > x  
    => "" 

不。 X返回空,甚至无法检查是否有错误

尝试 2:

> 1.9.3-p125 :022 > x = system("mysqldump falala") mysqldump: Got error: 1045: Access denied for user 'root'@'localhost' (using password: NO)
> when trying to connect  
=> false
1.9.3-p125 :023 > x
 => false 

更好。这样,如果命令成功,x 就会得到信息,但仍然没有控制台输出。

我还是 Ruby 的新手,但我认为 Ruby 会继续运行而无需等待 mysqldump 执行它的操作,但我确实需要该输出(因为如果发生错误,脚本会发送错误/控制台输出)

我需要运行的完整命令是这样的
mysqldump --host=#{host} --user=#{user} --password=#{pass} #{name} | gzip -9 > #{name}.sql.gz

【问题讨论】:

  • 您还需要这方面的帮助吗?
  • 是的,仍然需要帮助。我当前的解决方案是,我创建了一个循环,检查 10 次(每 6 秒)是否出现 MySQL Dump 文件(我现在不希望拉下更大的数据库),如果文件没有出现,我抛出一个错误,否则我认为一切正常。但我不认为这是一个真正的解决方案。我不确定“open3”方法如何与更高级的终端命令一起使用(我的意思是一个语句中有多个命令 - echo 'aa' | echo 'bb'
  • 你看过Open3库的流水线方法吗?它构建了您所描述的管道。

标签: mysql ruby console terminal mysqldump


【解决方案1】:

反引号和#system 都会阻塞父进程,直到子进程退出。 #system 只返回退出状态码。反引号仅返回标准输出。所以你也想得到stderr。一种方法是使用Open3:

require 'open3'

stdout, stderr, status = Open3.capture3('mysqldump', 'falala')

fail "An error happened: #{stderr}" unless status.exitstatus == 0

这种方法显然不适用于大型转储,因为整个转储都被放入 stdout 变量中。要将 mysqldump 的输出重定向到文件,我建议查看 Process.spawn

【讨论】:

  • mysqldump 有一个选项 --result-file,如果指定,它将把 SQL 输出到那个文件。这还有一个额外的好处,那就是不会在您的数据中破坏 CRLF
  • 如果发送到子shell的命令附加了2>&1,则使用反引号可以捕获与STDOUT混合的STDERR。有时这会导致混乱的流,但对于那些快速而肮脏的时候,当子应用程序死掉并且您想知道原因时,这非常有用。
  • 这是我运行 mysqldump --host=#{host} --user=#{user} --password=#{pass} #{name} | gzip -9 > #{name}.sql.gz 的完整命令,它将如何处理所有这些?
  • 我同意 Tin Man 关于使用重定向操作符快速而肮脏地抓取 stderr 的观点。正如他所指出的,这可能会导致混乱的流。在那些我想为管道中的每个程序单独的 stderr 流的情况下,我手动将它们的 stdout 和 stdin 与 ruby​​ 中的管道连接在一起,并捕获单独的 stderr 流。执行此操作的代码非常少。
猜你喜欢
  • 2017-02-25
  • 2018-01-17
  • 2017-05-29
  • 2016-06-02
  • 2016-10-29
  • 2013-04-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多