【发布时间】:2014-10-09 03:24:50
【问题描述】:
我有一个小的 ruby 脚本,它执行 mysql 的导入方式:mysql -u <user> -p<pass> -h <host> <db> < file.sql,但使用 Open3.popen3 这样做。这就是我目前所拥有的:
mysqlimp = "mysql -u #{mysqllocal['user']} "
mysqlimp << "-h #{mysqllocal['host']} "
mysqlimp << "-p#{mysqllocal['pass']} "
mysqlimp << "#{mysqllocal['db']}"
Open3.popen3(mysqlimp) do |stdin, stdout, stderr, wthr|
stdin.write "DROP DATABASE IF EXISTS #{mysqllocal['db']};\n"
stdin.write "CREATE DATABASE #{mysqllocal['db']};\n"
stdin.write "USE #{mysqllocal['db']};\n"
stdin.write mysqldump #a string containing the database data
stdin.close
stdout.each_line { |line| puts line }
stdout.close
stderr.each_line { |line| puts line }
stderr.close
end
这实际上是在做这项工作,但有一件事情困扰着我,与我想看到的输出有关。
如果我将第一行更改为:
mysqlimp = "mysql -v -u #{mysqllocal['user']} " #note the -v
然后整个脚本永远挂起。
我猜,这是因为读写流相互阻塞,我还猜想stdout 需要定期刷新,以便stdin 继续被消耗。换句话说,只要stdout 的缓冲区已满,进程就会等到它被刷新,但由于这是首先在最底层完成的,所以永远不会发生这种情况。
我希望有人能验证我的理论吗?我如何编写代码来打印出来自stdout 的所有内容并将所有内容写入stdin?
提前谢谢!
【问题讨论】: