2

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

4

1 回答 1

5

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

于 2012-10-04T16:07:37.117 回答