2017-10-28 4 views
0

Mit einer plattformübergreifenden Lösung (GNU/Linux, Windows) möchte ich ein externes Programm im Hintergrund erzeugen, es aufzeichnen pid und später das Programm über den gespeicherten pid stoppen.Process.spawn (Ruby 1.9.x): Wie überprüft man, ob das Laichen erfolgreich war und Fehler entdeckt?

Betrachten Sie diesen Code in Ruby-1.9.x:

pid = Process.spawn("xxx") 
puts pid 

stdout/stderr:

8117 
sh: 1: xxx: not found 

keine Ausnahme ausgelöst wird, und ich sehe keinen Weg, um die Tatsache zu erkennen, dass der Spawn nicht erfolgreich war (xxx ist kein gültiger Befehl).

Was ist der beste Weg zu erkennen, dass dieser Spawn nicht erfolgreich war?

Antwort

1

Process#spawn gibt eine Prozess-ID zurück. Wenn Sie eine Prozess-ID zurückbekommen, ist die Funktion selbst nicht fehlgeschlagen. In Ruby> = 2.0.0 wird Process#spawnErrno::ENOENT werfen, wenn es den Befehl nicht finden kann. Da Ruby 1.9 nicht unterstützt wird, ist die beste Lösung, Ruby zu aktualisieren.

Ein Hack, der helfen könnte, zu testen, ob der Prozess tatsächlich ausgeführt wird, nachdem der Aufruf zurückgegeben wird. Leider wird dies plattformspezifisch sein.

Leider, wenn der Prozess zu der Zeit abgeschlossen ist, die Sie für seine Existenz testen, können Sie nicht sagen. Wahrscheinlich wollen Sie nach den Ergebnissen (was immer es auch tut) schauen, um zu sehen, ob es auch getan hat.

Ein anderer Ansatz, wenn Sie das gestartete Programm steuern, besteht darin, eine Named Pipe vor dem Start zu öffnen und Ihr Ruby-Programm eine Nachricht über die Pipe senden zu lassen, die es ausführt. Sie können dann von der Pipe nach dem spawn-Aufruf auf nicht blockierende Weise lesen und Timeout verwenden, um zu verhindern, dass es für immer blockiert. Ein einfacherer, weniger sauberer Ansatz wäre, dass das Programm etwas Deterministisches in eine Datei schreibt, das Sie mit einem einfachen File.exist? Test testen können, um zu sehen, ob es dort ist.

+0

Dies war hilfreich. Vielen Dank. – cschol

Verwandte Themen