2 Stimmen

Wie bringt man Ruby dazu, auf mysqldump zu warten?

Ich möchte die Ausgabe von mysqldump einer Variablen zuweisen und die generierte Ausgabe später verwenden.

Versuch 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  
    => "" 

Nö. X kommt leer zurück, kann nicht einmal prüfen, ob ein Fehler aufgetreten ist

Versuch 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 

Besser. Auf diese Weise hat x die Information, ob der Befehl erfolgreich war, aber immer noch keine Konsolenausgabe.

Ich bin noch neu in Ruby, aber ich denke, was passiert, ist, dass Ruby weiterhin ausgeführt wird, ohne zu warten, dass mysqldump seine Sache zu tun, aber ich brauche wirklich diese Ausgabe (weil im Falle eines Fehlers, das Skript die Fehler/Konsole Ausgabe mailen würde)

Der vollständige Befehl, den ich ausführen muss, lautet etwa so
mysqldump --host=#{host} --user=#{user} --password=#{pass} #{name} | gzip -9 > #{name}.sql.gz

5voto

Catnapper Punkte 1855

Sowohl Backticks als auch #system blockieren den Elternprozess, bis der Kindprozess beendet wird. #system gibt nur den Exit-Statuscode zurück. Backticks gibt nur stdout zurück. Sie wollen also auch stderr erhalten. Eine Möglichkeit, dies zu tun, ist die Verwendung von Öffnen3 :

require 'open3'

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

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

Dieser Ansatz eignet sich natürlich nicht für große Dumps, da der gesamte Dump in die Variable stdout geschlürft wird. Um die Ausgabe von mysqldump in eine Datei umzuleiten, empfehle ich einen Blick auf Prozess.laichen .

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X