2012-04-11 44 views
7

我在Node.js中創建了一個小型私有遊戲服務器管理器;目前,它由通過child_process產卵運行遊戲:通過nodejs重新連接產生的進程

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

只要經理繼續運行,我能管的命令和處理孩子,我想。但是,請考慮我的經理崩潰或關閉的可能性。我如何重新連接到以前衍生的子進程(當管理者關閉時仍然運行)?我可以存儲pidfiles以基於pid嘗試重新連接;但我不知道如何獲得child_process對象訪問該對象的子對象。

我真的希望這可以恢復;任何幫助表示讚賞,謝謝!


請注意:遊戲服務器是專有的,有些例子是我的世界,來源DS等。假設我沒有訪問服務器源。


編輯

閱讀從節點的child_process一些源代碼看起來,如果你指定稱爲stdinStreamstdoutStream選項的屬性,或者stderrStream它應該只是打開一個套接字它像後。 (見行428 - 496)。所以問題是,我怎麼停止產生實際上做一個產卵,而是隻是基於指定的PID和我通過的流設置其值。 (我會得到我的stdinStreamfs.createWriteStream('/proc/PID/fd/0');它應該工作,因爲這FD作爲一個管道創建。)

+2

hmm。我不知道你是否可以用任何編程語言來做到這一點,更不用說js/node了。如果是我,我會看看使用套接字來解決這個問題 – ControlAltDel 2012-04-11 19:48:58

+0

我通過子進程的stdin傳遞一些命令,因爲我幾乎沒有使用* nix套接字的經驗,我怎麼才能完成重新獲得'管道'到孩子的「stdin」? – Chad 2012-04-11 21:05:40

+0

任何人對此有任何想法? – Chad 2012-04-15 17:17:04

回答

0

在與節點項目中的一些人交談之後,看起來我能完成這個任務的唯一方法是處理proc fs中的原始文件描述符。我可能會模擬出類似於child_process對象的東西,並創建如下的流:

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

這種方法仍然有效嗎?我似乎無法讓它與Node v0.10一起工作。我正在嘗試創建一個Minecraft服務器管理員,如果您有任何問題,請提供一些見解。 :) – 2013-05-14 04:49:21

+0

我從來沒有得到這個在0.6上工作100%,所以我放棄了試圖做這樣的事情不幸:/ – Chad 2013-05-24 16:49:51

+0

悲傷的一天,看起來我可能不得不效仿。 – 2013-05-24 17:29:49

1

要擴展什麼,有人說在上面留言,您可以使用http://nodejs.org/api/net.html其中每個子進程創建一個服務器(net.createServer()),並且您保存了哪些孩子在某處的哪些端口監聽的列表,然後當您的主站重新啓動時,該列表會找到該孩子列表並連接到每個服務器。您從net.createConnection()獲得的Sockets將取代主人中的child_process對象。

net服務器和插座實現相同的讀取和寫入Stream接口,stdio,所以設置和連接之後,你應該能夠write(...)pipe()事件,就像你一直在做。

這可能不是最好的解決方案,但我相信它會起作用。

+0

不幸的是,這意味着要爲每個需要運行的遊戲服務器啓動一個節點實例,並且如果這些孩子中的任何一個發生故障或關閉,我就在同一條船上。 – Chad 2012-04-12 10:13:54

+0

沒錯,它有很多新的節點實例,但我認爲產卵也是如此。如果一個人崩潰,我不會跟隨在同一條船上,當然你必須重新啓動它,但這樣你可以重新連接現有的東西。 – 2012-04-12 17:35:41

+0

你說的是有一個主節點proc產卵子節點procs並通過套接字與他們溝通,這是很好的和可恢復的。但是* child * node proc會產生它的遊戲服務器並通過'stdin'與它通信。因此,如果該*孩子*崩潰,您可以重新連接到一個新的孩子,但該孩子無法重新連接到遊戲服務器,這是整個問題。遊戲服務器可以是一個java進程,一個源專用服務器,任何事情都可以。 – Chad 2012-04-12 21:30:28

相關問題