ruby - 如何让 Ruby 等待 mysqldump?

标签 ruby console terminal mysql

我想将 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

最佳答案

反引号和#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 .

关于ruby - 如何让 Ruby 等待 mysqldump?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12730986/

相关文章:

ruby - 用于验证仅包含字符(没有特殊字符但带有重音字符)、空格和数字的字符串的正则表达式

ruby - 使用 RSpec 2 测试 RUBY_PLATFORM

ruby - 我可以在 gemfile 中强制 gem 的依赖项吗?

architecture - 设计控制台应用程序时的架构考虑?

linux - 如何在 linux c 上添加 dir.h 库

regex - grep XML 值,如果包含数字则将其导出

ruby - 在 RSpec 中期待 Lambda

c++ - 重定向 MFC GUI 应用程序中使用的 c++ dll 的控制台输出

java - 在 Linux 中以 Java 代码执行 FFmpeg 命令的问题

macos - make 找不到已安装的库