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 は終了ステータス コードのみを返します。バッククォートは stdout のみを返します。したがって、stderr も取得する必要があります。これを行う 1 つの方法は、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 に答える