2012-04-11 9 views
7

Ich erstelle einen kleinen proprietären Game Server Manager in Node.js; derzeit läuft es das Spiel, indem über child_process Laichen:Erneutes Verbinden mit dem erzeugten Prozess über nodejs

var server = spawn(cmd, args, { cwd: 'something' }); 

Solange der Manager ich Rohr Befehle können läuft weiter und mit dem Kind umgehen, wie Ich mag würde. Bedenken Sie jedoch die Möglichkeit, dass mein Manager abstürzt oder geschlossen ist. Wie würde ich dann wieder an den zuvor erstellten Child-Prozess (der noch lief, während der Manager war) wieder anhängen? Ich kann pidfiles speichern, um zu versuchen, und wieder zu verbinden, die auf pid basieren; aber ich bin mir nicht sicher, wie man ein child_process Objekt mit Zugang zu den stdio Objekten des Kindes bekommt.

Ich möchte wirklich, dass dies wiederherstellbar ist; jede Hilfe wird geschätzt, danke!


Bitte beachten: Die Spielserver sind proprietär, einige Beispiele sind Minecraft, Quelle DS usw. Angenommen, ich habe keinen Zugriff auf die Sever Quelle.


EDIT

wie einige Quellcode von Knotens child_process sieht es nach dem Lesen, wenn Sie stdinStream, stdoutStream oder stderrStream es sollte nur eine Steckdose, um es öffnen genannt eine Eigenschaft in den Optionen festlegen. (Siehe Zeilen 428 - 496). Das Problem ist also, wie kann ich aufhören spawn von eigentlich machen einen Spawn und stattdessen nur seine Werte auf der Grundlage einer angegebenen PID und Streams ich passiere. (Ich würde meine stdinStream erhalten, indem fs.createWriteStream('/proc/PID/fd/0'); zu tun, die arbeiten sollte, da das fd als Rohr erzeugt wird.)

+2

hmm. Ich frage mich, ob Sie das in irgendeiner Programmiersprache tun könnten, geschweige denn js/node. Wenn ich es wäre, würde ich einen Blick auf die Verwendung von Sockets werfen, um diese – ControlAltDel

+0

zu lösen. Ich übergebe einige Befehle über 'stdin' des Child-Prozesses, da ich wenig Erfahrung mit * nix Sockets habe. zur "stdin" des Kindes? – Chad

+0

Hat jemand irgendwelche Ideen dazu? – Chad

Antwort

0

Nachdem ich mit einigen der Jungs auf dem Knotenprojekt gesprochen habe, sieht es so aus, als ob die einzige Möglichkeit, dies zu bewerkstelligen, darin besteht, mit den rohen Dateideskriptoren in den proc fs umzugehen. Ich werde wahrscheinlich etwas Ähnliches wie ein child_process-Objekt mockern und seine Ströme wie erstellen:

var child = {}; 
child.stdin = fs.createWriteStream('/proc/PID/fd/0'); 
child.stdout = fs.createReadStream('/proc/PID/fd/1'); 
child.stderr = fs.createReadStream('/proc/PID/fd/2'); 
+0

Funktioniert diese Methode noch? Ich kann nicht scheinen, es mit Knoten v0.10 zu arbeiten. Ich versuche, einen Minecraft-Server-Admin zu erstellen und möchte dir einen Einblick geben, wenn du welche hast. :) –

+0

Ich habe das nie 100% auf 0,6 arbeiten lassen, also habe ich aufgegeben, so etwas wie dieses zu tun:/ – Chad

+0

Trauriger Tag, sieht aus, als ob ich vielleicht folgen muss. –

1

zu verlängern, was jemand in einem Kommentar oben erwähnt, können Sie in der Lage sein http://nodejs.org/api/net.html zu verwenden, wo jedes Kind Prozess einen Server erstellt (net.createServer()) und Sie behalten eine Liste mit, was Kinder an welchen Ports irgendwo hören, und wenn Ihr Master neu startet, geht es und findet diese Liste von Kindern und verbindet sich mit jedem ihrer Server. Die Sockets, die Sie von net.createConnection() erhalten, ersetzen die Objekte child_process in Ihrem Master.

net Server und Steckdosen implementieren die gleichen lesbarer und beschreibbarer Stream Schnittstellen wie stdio, so nach dem Aufstellen und Anschließen sollten Sie write(...) und pipe() Ereignisse der Lage sein, wie Sie tun worden sind.

Dies ist vielleicht nicht die beste Lösung, aber ich glaube, es wird funktionieren.

+0

Leider würde das bedeuten, dass ich für jeden Spielserver, den ich ausführen müsste, eine Knoteninstanz erstellen würde, und wenn eines dieser Kinder abstürzt oder geschlossen ist, bin ich im selben Boot. – Chad

+0

Wahr, es ist eine Menge neuer Knoten-Instanzen, aber ich dachte, dass Spawn das auch getan hat. Ich folge nicht davon, im selben Boot zu sein, wenn man abstürzt, natürlich müsste man es neu starten, aber auf diese Weise kann man sich wieder mit dem vorhandenen Zeug verbinden. –

+0

Sie sprechen über einen Master-Knoten proc spawn Kinder Knoten procs und kommunizieren mit ihnen über Sockets, die in Ordnung und wiederherstellbar ist. Aber dieser * child * node proc würde seinen Spielserver erzeugen und über 'stdin' mit ihm kommunizieren. Wenn also * child * abstürzt, kannst du dich mit einem neuen Kind verbinden, aber dieses Kind kann sich nicht mehr mit dem Spielserver verbinden, was das ganze Problem ist. Ein Spielserver kann ein Java-Prozess, ein dedizierter Quellserver, alles wirklich sein. – Chad

Verwandte Themen